किसी दिए गए लाइन पर एक फ़ाइल को दो फ़ाइलों में विभाजित करें


12

मैं एक फाइल में दिए गए लाइन नंबर पर एक फाइल को दो फाइलों में विभाजित करने के लिए यूनिक्स में एक रास्ता खोज रहा हूं।

split -l 100 file_nameमैं जो खोज रहा हूं, उसके करीब है, लेकिन यह कमांड कई फाइलें बनाता है, प्रत्येक 100 लाइनें। मैं दिए गए लाइन नंबर पर एक फाइल को दो फाइलों में विभाजित करने के लिए कमांड की तलाश कर रहा हूं। क्या यूनिक्स में ऐसा करने का कोई तरीका है?

जवाबों:


13

थोड़ा तंग समाधान:

(head -100 > f1.txt; cat > f2.txt) < input.txt

1
अच्छा समाधान है। wcपहले की गणना और इनपुट फ़ाइल अभी भी केवल एक बार संसाधित होती है, जैसे awkसमाधान के साथ ।
डब्यू

2
एक मामूली मौका है कि headउत्पादन करने के लिए पहली 100 लाइनों को खोजने के लिए सिर्फ 100 लाइनों से अधिक पढ़ा जाएगा f1.txt; उन अतिरिक्त बाइट्स द्वारा नहीं देखा जाएगा cat
चेंपर्स

यह बहुत मंद है
sdaffa23fdsf

12

उपयोग करें awk, ताकि आपको इनपुट फ़ाइल के माध्यम से केवल एक पास बनाने की आवश्यकता हो। निम्नलिखित मान लें कि आप पहली फ़ाइल में पहली 122 लाइनें चाहते हैं, और दूसरी में शेष।

awk 'NR < 123 { print >> "top_file"; next } {print >> "bottom_file" }' file_name

यह एक अंगूठे के योग्य है। यदि आप X से Y की फ़ाइल को विभाजित करना चाहते हैं, तो यह सबसे आसान है।
ग्लेन प्लास

यह समझने का सबसे आसान उपाय है। एक आकर्षण की तरह काम किया ... और मुझे लगता है कि मुझे अपने ओ'रिली सेड एंड अक्क किताब से धूल को ब्रश करना चाहिए जो मेरे पास 1999 या उसके बाद है, सेड सेक्शन अच्छी तरह से पढ़ा गया है, awk सेक्शन इतना नहीं है।
माइकल

यह @chepner टिप्पणियों में मिले कारण के लिए अतिरिक्त समाधान से बेहतर है। आप 'f2.txt' फ़ाइल में वर्ण ढीले कर देंगे। यह समाधान सटीक और कुशल है। awk ftw।
गोरान

7

आप दोनों भागों का उपयोग headऔर tailप्राप्त कर सकते हैं :

head -n K file_name > top_file
tail -n L file_name > bottom_file

जहां Kलाइन नंबर है, और Lनीचे से लाइनों की संख्या है (लाइनों की कुल संख्या - K)।

(आप का उपयोग कर लाइनों की कुल संख्या प्राप्त कर सकते हैं wc -l file_name)।


5

आप csplitइसे करने के लिए (यदि उपलब्ध हो) का उपयोग कर सकते हैं :

csplit file N+1

फ़ाइल को दो टुकड़ों में विभाजित करेगा, एक टुकड़ा (और सहित) लाइन नंबर Nऔर दूसरा टुकड़ा लाइन नंबर N+1से अंतिम लाइन तक।
यदि आप (लेकिन शामिल नहीं) लाइन नंबर तक विभाजित करना चाहते हैं N:

csplit file N

यह बहुत बढ़िया बात है! धन्यवाद, इसने मेरे लिए समस्या को पूरी तरह से हल कर दिया।
जर्ट्रिन

टुकड़ों में 20GB फ़ाइल को विभाजित करने के लिए सर्वश्रेष्ठ प्रदर्शन।
dr0i

@ dr0i - कोई आश्चर्य नहीं, csplitइस नौकरी के लिए अनुकूलित है।
don_crissti

एक 200M-लाइनों-फाइल को विभाजित करके मुझे "मेमोरी समाप्त हो गई" एक सनसनीखेज 2008 के लिए दिनांकित का उपयोग करके। 2011 के लिए csplit दिनांक का उपयोग करके यह काम करता है :)
dr0i

4

दोनों headऔर tailउनके पास फ़ाइल के "अन्य" छोर से लाइनों का उत्पादन करने का विकल्प है, अन्यथा वे नहीं करेंगे। तो आपके पास ये दो विकल्प हैं:

head -n 100 source.txt > file1.txt
head -n -100 source.txt > file2.txt

या (जहां NNN आउटपुट से 100 कम है wc -l source.txt):

tail -n +NNN source.txt > file1.txt
tail -n NNN source.txt > file.txt

आप के अपने संस्करण के लिए मैनुअल पृष्ठों पढ़ सकते हैं headऔर tailअधिक जानकारी के लिए।


0

आप 'wc', 'dc', 'head' और 'tail' का उपयोग कर सकते हैं। अर्थात

unix> wc -l foo
545 /tmp/foo
unix> dc -e '545 100 - p'
445
unix> head -n 100 foo > filea
unix> tail -n 445 foo > fileb

उपयोग में आसानी के लिए, आप एक शेल स्क्रिप्ट में बदल सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.