स्प्लिट कमांड का उपयोग करके मैं टेक्स्ट फाइल को 70% और 30% में कैसे विभाजित कर सकता हूं?
स्प्लिट कमांड का उपयोग करके मैं टेक्स्ट फाइल को 70% और 30% में कैसे विभाजित कर सकता हूं?
जवाबों:
नीचे दिए गए आदेश 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
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
आप 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
एस गूंगे हैं और मानकों का अनुपालन नहीं करेंगे , इसलिए यह सभी सेटअपों पर काम नहीं करेगा ...
{ 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
।
निम्नलिखित कोड का उपयोग कर 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