किसी टेक्स्ट फ़ाइल की लाइनों का मध्य भाग निकालें?


17

मैं डेटाबेस स्क्रिप्ट सम्मिलित करने के लिए एक बड़ी पाठ फ़ाइल को पार्स करने के लिए एक PHP स्क्रिप्ट लिख रहा हूं। हालाँकि मेरे होस्ट पर, फ़ाइल बहुत बड़ी है, और मैंने PHP के लिए मेमोरी सीमा को मारा।

फ़ाइल में लगभग 16,000 लाइनें हैं; मैं इसे चार अलग-अलग फाइलों में विभाजित करना चाहता हूं (पहली बार में) यह देखने के लिए कि क्या मैं उन्हें लोड कर सकता हूं।

पहला भाग मुझे मिल सकता है head -4000 file.txt। मध्य खंड थोड़े पेचीदा हैं - मैं पाइपिंग tailआउटपुट head( tail -4001 file.txt | head -4000 > section2.txt) के बारे में सोच रहा था , लेकिन क्या कोई दूसरा / बेहतर तरीका है?

वास्तव में मेरा तर्क गड़बड़ है - धारा दो के लिए, मुझे ऐसा कुछ करने की आवश्यकता होगी tail -12001 file.txt | head - 4000, और फिर tailअगले खंडों के लिए तर्क को कम करना होगा । मैं पहले से ही मिश्रित हो रहा हूँ! : पी

जवाबों:


27

यदि आप गड़बड़ नहीं करना चाहते हैं, लेकिन फिर भी इसका उपयोग कर रहे हैं tailऔर head, tailशुरुआत से लाइन-काउंट का उपयोग करने का एक उपयोगी तरीका है , अंत नहीं:

tail -n +4001 yourfile | head -4000

... लेकिन सिर्फ फाइलों को विभाजित करने के लिए बनाया गया एक बेहतर, स्वचालित उपकरण कहलाता है ... split! यह जीएनयू कोर्यूटिल्स का भी एक हिस्सा है, इसलिए किसी भी सामान्य लिनक्स सिस्टम में यह होना चाहिए। यहां बताया गया है कि आप इसका उपयोग कैसे कर सकते हैं:

split -l 4000 yourInputFile thePrefixForOutputFiles

( man splitसंदेह में देखें )


19

सिर और पूंछ को जोड़कर जैसा आपने किया था, काम करेगा, लेकिन इसके लिए मैं उपयोग करूंगा sed

sed -n '1,4000p' input_file # print lines 1-4000 of input_file

यह आपको त्वरित शेल फ़ंक्शन के साथ आपकी समस्या को हल करने देता है

chunk_it(){
    step=4
    start=1
    end=$step
    for n in {1..4} ; do
        sed -n "${start},${end}p" "$1" > "$1".$start-$end
        let start+=$step
        let end+=$step
    done
}

chunk_it your_file

अब आपके पास your_file.1-4000 और yuor_file.4001-8000 इत्यादि हैं।

नोट: बैश की आवश्यकता है


3
मुझे सेड तरीका पसंद है।
fanchyna

यह मेरे लिए काम नहीं करता है क्योंकि sed बाहर नहीं निकलता है। यह उन रेखाओं को प्रिंट करता है, जिन्हें मैं रोकना चाहता हूं, लेकिन मुझे ctrl-c आउट करना होगा, और परिणामस्वरूप, मैं इसे किसी फ़ाइल पर पुनर्निर्देशित नहीं कर सकता। इसे उपयोगी बनाने के लिए कोई सुझाव?
ब्रेंट 212

पता लगा लिया! "sed -n '<start_line>, <end_line> w <output_file>' <input_file>" मेरे लिए काम करता है।
Brent212

@ Brent212 ध्यान देने के लिए एक और विकल्प यह है कि आप इसे कम में भी पाइप कर सकते हैं या आउटपुट को किसी फ़ाइल में रीडायरेक्ट कर सकते हैं।
काइल s
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.