मैं एक फ़ाइल में हर पंक्ति के 5 वें शब्द को कैसे हटा सकता हूं?


13

मैं एक फ़ाइल में प्रत्येक पंक्ति के 5 वें शब्द को हटाना चाहता हूं।

फ़ाइल की वर्तमान सामग्री:

File is not updated or and will be removed  
System will shut down f within 10 seconds  
Please save your work 55 or copy to other location  
Kindly cooperate with us D  

अपेक्षित उत्पादन:

File is not updated and will be removed  
System will shut down within 10 seconds  
Please save your work or copy to other location  
Kindly cooperate with us

जवाबों:


31

कैसे के बारे में cut:

$ cut -d' ' -f1-4,6- file.txt 
File is not updated and will be removed  
System will shut down within 10 seconds  
Please save your work or copy to other location  
Kindly cooperate with us
  • -d' ' अंतरिक्ष के रूप में सीमांकक सेट करता है

  • -f1-4,6- 5 वें को छोड़कर पहले 4 वें क्षेत्र (शब्द) का चयन करता है और फिर छठी से बाकी की छपाई जारी रखता है।


11

इसके साथ एक समाधान cut:

cut -d ' ' -f1-4 -f6- FILE

मल्टीपल कम से कम -fमेरे cut(GNU) में समर्थित नहीं है ..
heemayl

बीएसडी कट में समर्थित लेकिन मुझे आपकी प्रतिक्रिया मेरी तुलना में बेहतर लगी।
fd0

1
यदि यह GNU कट है, तो आपको --complementचीजों को सरल बनाने के लिए ध्वज मिलता है cut --complement -d ' ' -f5:। आउटपुट को नई फ़ाइल पर पुनर्निर्देशित करना याद रखें, फिर mvयह मूल पर।
टोबे स्पाइट जूल

6

awk: 5 वां क्षेत्र निकालें

awk '{for (i=5; i<NF; i++) $i = $(i+1); NF--};1' file

यदि आप फ़ाइल को इन-प्लेस: /programming//q/16529716/7552 पर सहेजना चाहते हैं

आप केवल 5 वें फ़ील्ड की सामग्री को मिटा सकते हैं, लेकिन यह लगातार 2 आउटपुट फ़ील्ड विभाजकों को छोड़ देता है:

awk '{$5 = ""};1' file

यहाँ चेतावनी यह है कि awk में किसी भी फ़ील्ड का मान बदलने से प्रत्येक फ़ील्ड के बीच केवल 1 विभाजक के साथ पूरे "$ 0" को फिर से लिखने का दुष्प्रभाव होता है। यदि आप किसी भी संरेखण को बनाए रखना चाहते हैं, तो इसे ध्यान में रखा जाना चाहिए (जब तक कि ग्नू अक्क के पास इससे बचने का कोई विकल्प नहीं है? नियमित अवाक / नॉक $ 0 का पुनर्मूल्यांकन करेगा)
ओलिवियर दुलक

दोनों ही स्थिति में आप एक विभाजक के साथ लाइन को सुधारते हैं। यदि विभाजक में 2 स्थान या स्पेस + टैब है, तो परिणाम एक एकल स्थान है। यह ज्यादातर पाठ के लिए hoppefully ठीक है।
NeronLeVelu

4

POSIX sed के साथ:

sed -e 's/[^[:alnum:]_][[:alnum:]_][[:alnum:]_]*//4' <file

क्‍यों कक्षा को सीमित करें: अलनुम: और _ और कुछ नहीं तो :blank:या :space:?
NeronLeVelu

@ NeronLeVelu: यह इस बात पर निर्भर करता है कि आप कैसे परिभाषित करते हैं कि एक शब्द क्या है।
cuonglm

@mikeserv; अच्छा पकड़ा! मैंने अपना उत्तर अपडेट कर दिया।
कोउन्ग्लम १६'१५

\(कैप्चर ग्रुप किसके \)लिए है?
मिकसेर्व जूल

@ माइकर्स: मेरी गलत-टाइपिंग, मैंने सिर्फ सीमांकन को बनाए रखने के कुछ तरीके आजमाए हैं।
congonglm

2

ग्लेन ने एक समाधान पेश किया जो इसके बराबर है

awk '{$ 5 = ""; प्रिंट} ' फ़ाइल

जैसा कि उन्होंने और अन्य लोगों ने बताया है

  1. स्ट्रिप्स हर लाइन से व्हाट्सएप की अगुवाई करता है,
  2. व्हॉट्सएप के प्रत्येक तार (रिक्त स्थान और / या टैब) को एक ही स्थान पर संपीड़ित करता है, और
  3. चौथे और छह शब्दों के बीच दो रिक्त स्थान छोड़ता है।

तीसरी समस्या को ठीक करने के लिए एक हैक है

awk '{$ 5 = ""; प्रिंट} ' फ़ाइल | sed 's / /'

यह अभी भी किसी भी लाइन के अंत में एक या अधिक जोड़ा स्थान (स्थान) छोड़ देगा जिसमें पाँच या उससे कम शब्द थे। यदि आप एक ऐसे शब्द की पहचान कर सकते हैं जो इनपुट में कभी नहीं दिखाई देगा।

awk '{$ 5 = "गेंडा"; प्रिंट} ' फ़ाइल | sed 's / * गेंडा //'

भी संभाल लेंगे (लेकिन यह अभी भी समस्याओं को छोड़ देता है 1 और 2)।


2
 sed 's/^\(\([[:blank:]]*[^[:blank:]]\{1,\}\)\{4\}\)[[:blank:]]*[^[:blank:]]*/\1/' YourFile > Output.txt
  • अंतरिक्ष / टैब विभाजक (मेटा क्लास [: blank:]]) के आधार पर पॉज़िक्स सेड
  • 5 वें शब्द के बाद निम्न स्थान रखें, लेकिन पहले वाले को हटा दें

एक और अधिक मजबूत (sed सबसे लंबा पैटर्न संभव है और पैटर्न *पहले संस्करण में जुदाई या शब्द याद कर सकता है) लेकिन थोड़ा लंबा संस्करण

sed 's/^\([[:blank:]]*\([^[:blank:]]\{1,\}[[:blank:]]\{1,\}\)\{4\}\[^[:blank:]]\{1,\}/\1/' YourFile > Output.txt

1
sed 's/[^[:blank:]]*//5'
mikeserv

@ माइकर्स, यह दोनों को अलग करेगा, sed 's/[[:blank:]*[^[:blank:]]*//5'बेहतर है। बहुत अच्छी बात है। मुझे संदेह था कि sed प्रत्येक एकल चार को एक इकाई के रूप में लेते हैं लेकिन यह इकाई के रूप में सबसे बड़ा अटूट पैटर्न
लेता है

sed 's/[[:blank:]][^[:blank:]]*//4'5 वीं फील्ड को पूरी तरह से हटा देगा।
15

@ माइकर्स मान लें कि लाइन पर जगह शुरू नहीं हो रही है (जैसे नमूने में)
नेरोनेलवेलू

इस मामले में, हां, मुझे लगता है कि आप सही हैं। आमतौर पर इस तरह की बात एक अशक्त क्षेत्र होगी और व्यवहार सही होगा। इस मामले में आपको वैसा ही करना चाहिए जैसा @cuonglm ने किया और सुनिश्चित करें कि आप हर बार किसी शब्द का संदर्भ दें sed 's/[[:blank:]][^[:blank:]][^[:blank:]]*//4', या, w / GNU / BSD / Toybox seds sed -E 's/[[:blank:]][^[:blank:]]+//4':।
मिकसर्व



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