एक फाइल को दो में विभाजित करें


18

मेरे पास एक बड़ी फाइल है और उसे दो फाइलों में विभाजित करने की जरूरत है। मान लीजिए पहली फ़ाइल में 1000 लाइनें चुनी जानी चाहिए और दूसरी फ़ाइल में डाल दी जाएँ और पहली फ़ाइल में उन लाइनों को हटा दें।

मैं का उपयोग करने की कोशिश की, splitलेकिन यह कई हिस्सा बना रहा है।


आपने जांच की split --help?
ब्रायन

हाँ, मैंने इसे जाँच लिया है, लेकिन कई फाइलें बना रहा है, जिनकी मुझे कोई ज़रूरत नहीं है।
अरविंद

जवाबों:


31

सबसे आसान तरीका शायद उपयोग करना है headऔर tail:

$ head -n 1000 input-file > output1
$ tail -n +1001 input-file > output2

यही कारण है कि से पहले 1000 लाइनों डाल देंगे input-fileमें output1में अंत तक 1001 से, और सभी लाइनोंoutput2


13

मुझे लगता है कि splitआप सबसे अच्छे दृष्टिकोण हैं।

-l xxxxविकल्प का उपयोग करने का प्रयास करें , जहां xxxx प्रत्येक फ़ाइल में इच्छित पंक्तियों की संख्या है (डिफ़ॉल्ट 1000 है)।

-n yyयदि आप बनाई गई फ़ाइलों की मात्रा के बारे में अधिक चिंतित हैं, तो आप विकल्प का उपयोग कर सकते हैं । उपयोग -n 2आपकी फ़ाइल को केवल 2 भागों में विभाजित करेगा, चाहे प्रत्येक फ़ाइल में लाइनों की मात्रा कोई भी हो।

आप अपनी फ़ाइल में लाइनों की मात्रा गिन सकते हैं wc -l filename। यह लाइनों के विकल्प के साथ 'वर्डकाउंट' कमांड है।

संदर्भ

  • man split
  • man wc

1
यह है कि एक निश्चित संख्या में लाइनों के साथ फ़ाइलों का एक गुच्छा में विभाजित करने के लिए, या फ़ाइलों की एक निश्चित संख्या में समान रूप से कैसे विभाजित किया जाए। क्या एक 1000-लाइन फ़ाइल और एक फ़ाइल को हर चीज के साथ विभाजित करने का एक तरीका है? यही वह माँग रहा था; मैं इसे आदमी पेज में मिल सकता है
माइकल Mrozek

आप माइकल को सही कर रहे हैं। मुझे लगता है कि मैंने सवाल पर एक सरल दृष्टिकोण लिया। आप इस मामले में सबसे अच्छा समाधान है। दूसरा तरीका 'sed' कमांड का उपयोग करना होगा: sed -n 1,1000 originalfile> first_1000_lines। sed '1,1000d' originalfile> शेष_लाइन्स।
लुसिएन रेवेन

बेशक आप कर सकते थे split -l 1000 bigfile && mv xaa piece1 && cat x?? > piece2 && rm x??
जी-मैन का कहना है कि 'मोनिका'

8

यह इसके लिए एक काम है csplit:

csplit -s infile 1001 

silently विभाजित होगा infile, पहला टुकड़ा xx00- अप करने के लिए, लेकिन लाइन 1001 और दूसरा टुकड़ा सहित xx01- शेष लाइनें नहीं।
यदि आप -fकिसी उपसर्ग का उपयोग और निर्दिष्ट कर रहे हैं, तो आपको विभिन्न आउटपुट फ़ाइल नामों की आवश्यकता होने पर विकल्पों के साथ खेल सकते हैं :

csplit -sf piece. infile 1001 

नाम की दो फाइलें piece.00और बनाता हैpiece.01


स्मार्ट के साथ headआप कुछ ऐसा भी कर सकते हैं:

{ head -n 1000 > 1st.out; cat > 2nd.out; } < infile

1
वाह, यह वास्तव में के लिए एक काम है csplit। बहुत अच्छा। (मैं अभी POSIX आदेशों की सूची के माध्यम से पढ़ रहा हूं और csplitपहली बार में कमांड के उद्देश्य के चारों ओर मेरे सिर को लपेटने में भारी परेशानी थी । यह वास्तव में बहुत सरल है।) :)
वाइल्डकार्ड

4

एक कमांड में एक सवाल करने के लिए एक सरल तरीका है:

awk '{ if (NR <= 1000) print > "piece1"; else print > "piece2"; }' bigfile

या, आपमें से जो वास्तव में लंबी, सहज ज्ञान युक्त आज्ञाओं से घृणा करते हैं,

awk '{ print > ((NR <= 1000) ? "piece1" : "piece2"); }' bigfile
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.