मैं किसी फ़ाइल में कुछ पंक्तियों (लाइन नंबरों का उपयोग करके) को कैसे निकालूँ?


27

ऐसी विशिष्ट लाइनें हैं जिन्हें मैं किसी फ़ाइल से निकालना चाहता हूं। मान लीजिए कि यह लाइन 20-37 है और फिर लाइन 45 है। मैं उन लाइनों की सामग्री को निर्दिष्ट किए बिना कैसे करूंगा?


आपकी फाइल कितनी बड़ी है? क्या इसे मेमोरी में लोड किया जा सकता है?
फहीम मीठा

कुछ किलोबाइट।
tshepang

जवाबों:


29

के साथ sed, जैसे:

sed '20,37d; 45d' < input.txt > output.txt

यदि आप इन-प्लेस में ऐसा करना चाहते हैं:

sed --in-place '20,37d; 45d' file.txt

क्या इसमें करने का कोई तरीका है?
tshepang

मेरा सुझाव है कि sed -i फ़ाइल
enzotib

1
@ त्सेपंग: उपयोग ed, या जीएनयू sed -i, या sponge, या एक बड़ी फ़ाइल विधि
गिलेस एसओ- बुराई को रोकना '

3
मैं अक्सर संभवतः गुमराह अवधि के बारे में सोचा गया है यथा-स्थान ,, जब की चर्चा करते हुए 'sed' तो मैं उस में 'आदमी sed' ऊपर देखा: --in-जगह [= SUFFIX] This option specifies that files are to be edited in-place. GNU 'sed अस्थायी फ़ाइल बनाने करके करता है और मानक आउटपुट के बजाय इस फ़ाइल को आउटपुट भेज रहा है। `... मुझे किसी अन्य 'sed' के बारे में नहीं पता है, लेकिन एक स्ट्रीम एडिटर के साथ" अपडेट "करने का लॉजिस्टिक्स " कंप्यूट "नहीं है :)
पीटर।

2
अधिकांश "इन-प्लेस" विधियाँ मेरे अनुभव में, एक अस्थायी फ़ाइल का उपयोग करती हैं।
फहीम मीठा

5

यदि फ़ाइल मेमोरी में आराम से फिट होती है, तो आप भी उपयोग कर सकते हैं ed
कमांड sedएक उल्लेखनीय अंतर के साथ ऊपर के समान हैं : आपको अवरोही क्रम में हटाए जाने वाले लाइन नंबर / रेंज की सूची को पास करना होगा (उच्चतम लाइन नो / रेंज से निम्नतम एक तक)। कारण यह है कि जब आप लाइनों को हटाते हैं / सम्मिलित / विभाजित / जोड़ते हैं ed, तो पाठ बफर को प्रत्येक उपकमांड के बाद अपडेट किया जाता है, इसलिए यदि आप कुछ लाइनें हटाते हैं, तो शेष पंक्तियाँ अब बफर में उसी स्थिति में नहीं रहेंगी जब अगले सबकोमांड को निष्पादित किया जाता है। तो आपको 1 पीछे की ओर शुरू करना होगा ।
इन-प्लेस संपादन:

ed -s in_file <<IN
45d
20,37d
w
q
IN

या

ed -s in_file <<< $'45d\n20,37d\nw\nq\n'

या

printf '%s\n' 45d 20,37d w q | ed -s in_file

यदि आप फ़ाइल को लिखने के बजाय परिणामी आउटपुट को प्रिंट करना चाहते हैं, तो रिंट wको ,pरिंट से बदलें । यदि आप मूल फ़ाइल को अक्षुण्ण रखना चाहते हैं और किसी अन्य फ़ाइल को लिखना चाहते हैं तो आप नई फ़ाइल का नाम wसंस्कार उपकमांड पास कर सकते हैं :

ed -s in_file <<IN
78,86d
65d
51d
20,37d
w out_file
q
IN

1 जब तक आप प्रत्येक dईटेल के बाद नई लाइन नंबरों की गणना करने के लिए तैयार नहीं होते हैं , जो इस विशेष मामले के लिए काफी तुच्छ है (लाइनों को 20-37 हटाने के बाद, यानी 18 लाइनें, लाइन 45 लाइन 27 हो जाती है) ताकि आप चला सकें:

ed -s in_file <<IN
20,37d
27d
w
q
IN

हालाँकि, यदि आपको कई लाइन नंबर / रेंज को हटाना है, तो पीछे की ओर काम करना एक बिना दिमाग वाला है।


क्या qकमांड अंत में उपयोगी है? मुझे लगता है कि यह किसी भी तरह से बाहर निकलता है।
टॉम फेनेच

@TomFenech - सभी कार्यान्वयन किसी भी तरह से बाहर नहीं निकलते हैं (हालांकि अधिकांश करते हैं ... मैं अब उस थ्रेड को नहीं पा सकता हूं जहां यह चर्चा की गई थी ...)
don_crissti

1

बस इसे मेमोरी में पढ़ें, इसे बदल दें, फिर इसे वापस लिखें। आप कुछ ऐसा कर सकते हैं

filename = "foo"
f = open(filename, 'r+')                                                                                                                                 
linenums = [1, 3]                                                                                                                                            
s = [y for x, y in enumerate(f) if x not in [line-1 for line in linenums]]                                                                                                                                          
f.seek(0)
f.write(''.join(s))
f.truncate(f.tell())
f.close()

5 लाइन फ़ाइल के साथ परीक्षण किया गया। Http://pleac.sourceforge.net/pleac_python/fileaccess.html पर क्रेडिट , "एक फ़ाइल को बिना अस्थायी फ़ाइल के स्थान में संशोधित करना" अनुभाग देखें। Https://stackoverflow.com/questions/125703/how-do-i-modify-a-text-file-in-python भी देखें

कुछ नोट:

  1. कोई पहले फ़ाइल को छोटा कर सकता है, फिर उसे लिख सकता है, बजाय लिखने के लिए, फिर ऊपर की तरह छोटा कर सकता है। हालाँकि, मैं एक पायथन ध्वज के बारे में नहीं जानता, जो किसी को पढ़ने की अनुमति देता है, और फिर एक काट-छाँट लिखता है। लेकिन शायद मुझे कुछ याद आ रहा है, क्योंकि दस्तावेज़ स्पष्ट नहीं है। जो मुझे लाता है

  2. कभी-कभी अजगर डॉक्स वास्तव में चूसते हैं। Http://docs.python.org/library/functions.html#open देखें

    मोड 'r +', 'w +' और 'a' अपडेट करने के लिए फ़ाइल खोलें (ध्यान दें कि 'w +' फ़ाइल को काटती है)।

    क्या इससे आपको कोई मतलब है? "अद्यतन करने के लिए खुला" क्या है?

  3. मुझे नहीं पता कि अजगर में ऐसा करने से धारा के संपादक की तरह कुछ यूनिक्स का विरोध बेहतर है। यह अधिक पोर्टेबल हो सकता है, लेकिन मुझे नहीं पता कि पोर्टेबल सेड कैसा है। मैंने इसे सिर्फ इस तरह लिखा है क्योंकि मैं क्लासिक यूनिक्स टूल्स का उपयोग करने की तुलना में निम्न स्तर की प्रोग्रामिंग के साथ अधिक सहज हूं, जो कि यदि आप चाहते हैं तो वे ठीक करते हैं, लेकिन मुझे लगता है कि आम तौर पर कम लचीले होते हैं।

  4. यह दृष्टिकोण (फ़ाइल को मेमोरी में हेरफेर) डिस्क स्थान के लिए मेमोरी को ट्रेड करता है। यह कुछ सौ एमबी तक की फाइलों के लिए कुछ जीबी मेमोरी वाले मशीनों पर ओके काम करना चाहिए। पायथन बहुत कुशलता से तारों को संभालता नहीं है, इसलिए उदाहरण के लिए C / C ++ पर स्विच करना प्रदर्शन को थोड़ा बढ़ाएगा और मेमोरी के उपयोग को बहुत कम कर देगा।


0

आप पूर्व मोड में विम का उपयोग कर सकते हैं:

ex -sc '20,37d|45d|x' file
  1. d हटाना

  2. x सहेजें और बंद करें

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