2012-12-06 6 views
5

मेरे पास प्रक्रियाओं की एक स्वरूपित सूची है (शीर्ष आउटपुट) और मैं अनावश्यक जानकारी को हटाना चाहता हूं। उदाहरण के लिए मैं प्रत्येक शब्द के दूसरे शब्द + व्हाइटस्पेस को कैसे हटा सकता हूं।मैं शीर्ष (1) आउटपुट की प्रत्येक पंक्ति का दूसरा शब्द कैसे हटा सकता हूं?

उदाहरण:

1 a hello 
2 b hi 
3 c ahoi 

क्रमांक एक बी और सी हटाना चाहते।

+2

'ps' का उपयोग करें और '--format' – artbristol

+0

के साथ आउटपुट को कस्टमाइज़ करें, यह भी व्यवहार्य है, धन्यवाद –

+0

वास्तव में, पीएस का उपयोग करने के बजाए एक शीर्ष आउटपुट को काटना अब बेवकूफ लगता है –

उत्तर

10

आप cut कमांड का उपयोग कर सकते हैं।

cut -d' ' -f2 --complement file 

--complement उलटा करता है। यानी -f2 के साथ दूसरे क्षेत्र का चयन किया गया था। और --complement के साथ यदि दूसरे को छोड़कर सभी फ़ील्ड प्रिंट करता है। यह तब उपयोगी होता है जब आपके पास फ़ील्ड की चर संख्या होती है।

जीएनयू के कट में विकल्प --complement है। मामले में, --complement तो उपलब्ध नहीं है, तो निम्न में एक ही कार्य करता है:

कटौती '' -d -f1,3- फ़ाइल

अर्थ: 3 से समाप्त करने के लिए पहले क्षेत्र प्रिंट और फिर प्रिंट यानी इससे बाहर रखा गया दूसरा क्षेत्र और बाकी प्रिंट करता है। संपादित करें:

आप awk चाहें, तो आप कर सकते हैं: awk {$2=""; print $0}' file

यह खाली करने के लिए दूसरा सेट और पूरे पंक्ति (एक-एक करके) प्रिंट करता है।

+0

अच्छा समाधान +1। –

+2

'awk '{$ 2 =" "; प्रिंट} 'फाइल' हालांकि एक अतिरिक्त जगह छोड़ देता है। –

+0

@sudo_O यह सही है। मुझे लगता है कि जब तक फ़ील्ड व्हाइटस्पेस से अलग हो जाते हैं, तब तक यह ठीक है कि खेतों का उपयोग किस उद्देश्य के लिए किया जाता है। –

5

दूसरे स्तंभ स्थानापन्न करने sed का उपयोग करना:

sed -r 's/(\w+\s+)\w+\s+(.*)/\1\2/' file 
1 hello 
2 hi 
3 ahoi 

स्पष्टीकरण:

(\w+\s+) # Capture the first word and trailing whitespace 
\w+\s+ # Match the second word and trailing whitespace 
(.*)  # Capture everything else on the line 

\1\2  # Replace with the captured groups 

नोट्स: परिणामों को वापस file को बचाने के लिए -i विकल्प का उपयोग करें, -r विस्तारित नियमित अभिव्यक्ति के लिए है, man की जांच करें क्योंकि यह कार्यान्वयन के आधार पर -E हो सकता है।

या awk का उपयोग केवल निर्दिष्ट कॉलम मुद्रित करने के लिए:

$ awk '{print $1, $3}' file 
1 hello 
2 hi 
3 ahoi 

दोनों समाधान वहाँ गुण है, awk समाधान कॉलम का एक छोटा सा निश्चित संख्या के लिए अच्छा है, लेकिन आप एक अस्थायी फ़ाइल का उपयोग करने की दुकान करने की आवश्यकता है awk '{print $1, $3}' file > tmp; mv tmp file बदलता है जहां sed समाधान अधिक लचीला है क्योंकि कॉलम कोई समस्या नहीं है और -i विकल्प संपादन में करता है।

+0

ग्रेट स्पष्टीकरण, ऐसा लगता है उपयोग करने के लिए आसान हो। –

+0

मैंने शुरुआत में अजीब सोचा था। लेकिन फ़ील्ड के परिवर्तनीय संख्या के साथ, 'एनएफ' का उपयोग करके एक लूप की आवश्यकता हो सकती है। पहले ही +1 किया गया है :) –

+0

@ किंग्स इंडियन मैंने दोनों की योग्यता पर कुछ अतिरिक्त जानकारी जोड़ दी है। –

3

एक तरह से sed का उपयोग कर:

sed 's/ [^ ]*//' file 

परिणाम:

1 hello 
2 hi 
3 ahoi 
+0

यह एक अच्छा काम करता है, लेकिन मुझे लगता है कि sed उदा। awk –

3

बैश का उपयोग करना:

$ while read f1 f2 f3 
> do 
> echo $f1 $f3 
> done < file 
1 hello 
2 hi 
3 ahoi 
+1

आपकी फ़ाइल को पार करने वाले फिंगर्स में +,?, * या कोई अन्य खोल ग्लोबिंग वर्ण नहीं हैं या यदि आपके पास पैटर्न से मेल खाने वाली आपकी निर्देशिका में कोई भी फ़ाइल नहीं है। हमेशा अपने चरों को उद्धृत करें जब तक आपके पास कोई अच्छा कारण न हो। फिंगर्स ने यह भी पार किया कि आपकी फ़ाइल में कोई बैकस्लैश नहीं है। हमेशा अपने लूप को 'जबकि IFS = read -r line' के रूप में लिखें, जब तक आपके पास कोई अच्छा कारण न हो। अंत में - शैल लूप लिखना शायद ही कभी सही जवाब है। –

3

यह आप के लिए काम कर सकते हैं (जीएनयू sed):

sed -r 's/\S+\s+//2' file 
+0

+1 मुझे सिखाए जाने के लिए कि आप निर्दिष्ट कर सकते हैं कि 'sed' में कौन सा मौका –

संबंधित मुद्दे