स्प्लिट: कैसे अलग प्रतिशत में विभाजित करने के लिए?


14

स्प्लिट कमांड का उपयोग करके मैं टेक्स्ट फाइल को 70% और 30% में कैसे विभाजित कर सकता हूं?


क्या आप विभाजित कमांड का उपयोग करने के लिए तैयार हैं? यदि नहीं, तो आप इसे सीधे पाठ हेरफेर के साथ आसानी से कर सकते हैं, निश्चित रूप से पर्ल या पायथन का उपयोग करके। जब तक फ़ाइल बहुत गलत न हो, तब तक इसे मेमोरी में एक स्ट्रिंग के रूप में पढ़ें, फिर स्ट्रिंग को विभाजित करें। यदि फ़ाइल बहुत बड़ी है, तो अधिक काम करने की आवश्यकता है।
फहीम मीठा

@ फहीम मीठा फ़ाइल 64MB है। मुझे विभाजन का उपयोग करने का विचार पसंद है क्योंकि यह कोड लिखने से तेज है। मुझे आश्चर्य था कि अगर मैं फ़ाइल की 70% संगत लाइनों की संख्या निर्दिष्ट करता हूं, तो मुझे एक बड़ी फ़ाइल और एक छोटी फ़ाइल मिलती है। यह काम नहीं करना चाहिए?
aeuryzm

और हाँ .. यह काम किया .. क्या मुझे प्रश्न को हटा देना चाहिए?
aeuryzm

आपके ऊपर, लेकिन आवश्यक नहीं।
फहीम मीठा

कृपया अपना उत्तर साझा करें। ( meta.stackexchange.com/questions/12513/… )
dogbane

जवाबों:


14

नीचे दिए गए आदेश 50% से ऊपर के प्रतिशत के लिए काम करेंगे (यदि आप केवल दो फ़ाइलों में विभाजित करना चाहते हैं), त्वरित और गंदा दृष्टिकोण।

1) लाइनों के आधार पर 70% विभाजित

split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename 

2) बाइट्स के आधार पर 70% विभाजित

split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename

1
मैकओएसएक्स पर कभी-कभी इसके सामने एक स्थान के साथ लाइनों की संख्या वापस आ जाती है, कुछ ऐसा जो इस स्क्रिप्ट को तोड़ता है। पहले xargs की पाइपिंग उन जगहों को हटा देगी और चीजों को फिर से काम करेगी: split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
एमिल स्टेनस्ट्रॉम्

4

आप csplitदो टुकड़ों में विभाजित करने के लिए उपयोग कर सकते हैं (किसी भी प्रतिशत का उपयोग करके) जैसे पहला टुकड़ा - पहला 20% लाइनें, दूसरा टुकड़ा - शेष 80 पंक्तियों की संख्या:

csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))

$(wc -l < infile): लाइनों की कुल संख्या
2 / 10: प्रतिशत
+1: csplitविभाजन के कारण एक पंक्ति जोड़ेंup to but not including line N

आप केवल लाइनों के आधार पर विभाजित हो सकते हैं।
मूल रूप से, जब तक आपके पास लाइन नंबर है, तब तक $(( $(wc -l < file) * 2 / 10))आप किसी भी लाइन-ओरिएंटेड टूल का उपयोग कर सकते हैं:

sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile

या, यहां तक ​​कि कूलर:

{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile

हालांकि कुछ headएस गूंगे हैं और मानकों का अनुपालन नहीं करेंगे , इसलिए यह सभी सेटअपों पर काम नहीं करेगा ...


2
{   BS=$(($(wc -c <file) * $P / 100))
    dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null

... इस सरल मामले के लिए काम करना चाहिए क्योंकि आप केवल एक बार विभाजन कर रहे हैं - और इसलिए शायद splitथोड़ा ओवरकिल है। जब तक फ़ाइल खोज योग्य है, तब तक ddकेवल एक ही read()करेगा <stdin, और जो कुछ बिंदु पर छोड़ता है उसे catशुरू करने के लिए छोड़ दिया जाता है।read()dd

यदि फ़ाइल बड़ी है, तो count=1 bs=$big_ol_numथोड़ी सी लापरवाही मिल सकती है, और इसे कुछ अतिरिक्त - अभी तक सरल - शेल गणित के साथ अवरुद्ध किया जा सकता है।

एक गैर seekable इनपुट - एक पाइप से तरह - तिरछा हो सकता है dd', s परिणाम हालांकि यह w / जीएनयू साथ ही नियंत्रित किया जा सकता ddहै iflag=fullblock


0

निम्नलिखित कोड का उपयोग कर headऔर tailकिसी भी अनुपात (40 इस मामले में 60) के साथ काम करता है:

export FILE_NAME=train.vw
head -n $[ $(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100 ] ${FILE_NAME} > train_40.vw
tail -n +$[ ($(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100) + 1 ] ${FILE_NAME} > train_60.vw
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.