Awk का उपयोग करके किसी विशेष संख्या के बाद सभी कॉलम कैसे प्रिंट करें?


89

शेल पर, मैं एक विशेष कॉलम की आवश्यकता होने पर जागने के लिए पाइप करता हूं।

उदाहरण के लिए यह कॉलम 9 प्रिंट करता है:

... | awk '{print $9}'

मैं कॉलम 9 सहित सभी कॉलमों को प्रिंट करने के लिए awk को कैसे बता सकता हूं , सिर्फ कॉलम 9 को नहीं?


जवाबों:


82
awk '{ s = ""; for (i = 9; i <= NF; i++) s = s $i " "; print s }'

3
मामूली शोधन के एक जोड़े:awk -v N=9 '{sep=""; for (i=N; i<=NF; i++) {printf("%s%s",sep,$i); sep=OFS}; printf("\n")}'
ग्लेन जैकमैन

धन्यवाद @glenn, यह वास्तव में थोड़ा अधिक सामान्य है। वैसे भी - मैं निश्चित रूप से सहमत हूँ कि यह cutया इसके perlलिए उपयोग करना बेहतर होगा। इसका उपयोग केवल तभी करें जब आप वास्तव में इस पर जोर देते हैं awk
अमदन

1
@SiegeX: यह NUL बाइट्स नहीं जोड़ता है, यह प्रत्येक खाली क्षेत्र के बीच FS को छोड़ देता है।
अगली सूचना तक रोक दिया गया।

1
कृपया लालित्य के लिए @ आसचर का उत्तर देखें।

3
@veryhungrymike: लालित्य अच्छा है, लेकिन मैं सही होना चाहूंगा। : पी
अमदन

68

जब आप खेतों की एक श्रृंखला करना चाहते हैं, awkतो वास्तव में ऐसा करने के लिए एक सीधा आगे रास्ता नहीं है। मैं cutइसके बजाय की सिफारिश करेंगे :

cut -d' ' -f 9- ./infile

संपादित करें

डिफ़ॉल्ट रूप से एक टैब होने के कारण अंतरिक्ष क्षेत्र का परिसीमन जोड़ा गया। यह इंगित करने के लिए ग्लेन का धन्यवाद


15
कटौती के बारे में एक बात यह है कि यह एक विशिष्ट सीमांकक (डिफ़ॉल्ट रूप से टैब) का उपयोग करता है, जहां awk "व्हाट्सएप" का उपयोग करता है। कट के साथ, 2 लगातार टैब एक खाली फ़ील्ड का परिसीमन करते हैं।
ग्लेन जैकमैन

1
जैसा कि @glennjackman ने बताया, awk का सीमांतक "व्हाट्सएप" (कोई भी राशि, भी) है। इसलिए कट डिमाइटर को सिंगल स्पेस में सेट करना व्यवहार से भी मेल नहीं खाता। दुर्भाग्य से पाश सबसे अच्छा एक कर सकता है, इसलिए यह दिखता है।
पोन्चा

यह ठीक से काम नहीं करता है। आदेश का प्रयास करें find . | xargs ls -l | cut -d' ' -f 9-। किसी कारण से डबल स्पेस भी गिना जाता है। उदाहरण: lrwxrwxrwx 1 me me 21 Dec 12 00:00 ./file_a lrwxrwxrwx 1 me me 64 Dec 6 00:06 ./file_bपरिणामस्वरूप./file_a 00:06 ./file_b
मार्को पशकोव

@MarcoPashkov कृपया विस्तार से बताएं यह ठीक से काम नहीं करता है , विशेष रूप से विचार करके आप अपनी पाइपलाइन में ठीक उसी कोड का उपयोग करते हैं । वैसे, आपको कभी भी एलएस के उत्पादन को पार्स करने की कोशिश नहीं
सेजएक्सएक्स

कट यहां काम नहीं करता है। उदाहरण के लिए, यदि आपका इनपुट एक पंक्ति के लिए "फू बार" (एकल स्थान) है, और "फू ___ बार" (यानी कई रिक्त स्थान हैं, लेकिन एसओ इसे दिखाने के लिए बहुत स्मार्ट है), तो कट उन्हें अलग तरीके से संसाधित करेगा।
UKMonkey

54
awk '{print substr($0, index($0,$9))}'

संपादित करें : ध्यान दें, यह काम नहीं करता है यदि नौवें से पहले किसी भी क्षेत्र में नौवें के समान मूल्य है।


3
यह शानदार है!

10
@veryhungrymike: ... और नौवें से पहले किसी भी फ़ील्ड में नौवें के समान मान होने पर काम नहीं करता है।
आमदन

6
संभवतः क्लासिक वाक्य के कारण "उम्मीद है कि आपकी फ़ाइल में वह समस्या नहीं है"। यह कुल मिलाकर एक है नहीं-नहीं : एस में / डब्ल्यू राज्य के लिए इंजीनियरिंग "हम त्रुटि की जाँच जैसे नकारात्मक मूल्यों के इनपुट के लिए सहित समय बर्बाद करने के लिए नहीं जा रहे हैं, क्योंकि 'हमें आशा है कि उपयोगकर्ता उन्हें बाहर की कोशिश नहीं करने के लिए बुद्धिमान पर्याप्त हो जाएगा, हमारे टूल को क्रैश करना ''। HAHAHA! यह सुनने के लिए हमेशा प्यार! (मैं के हास्य अच्छी समझ की तरह) ठीक है, के रूप में बेवकूफ करना अस्तित्व है, यह डेवलपर के कर्तव्य अपने सामान बनाने के लिए है बेवकूफ प्रूफ ! इसके बजाय "मनुष्य में अच्छे के लिए उम्मीद"। यह बल्कि दार्शनिकों के साथ एक दृष्टिकोण है, न कि s / w इंजीनियरों के साथ ... LOL
वाक्यविन्यास

3
मैं त्रुटियों के लिए जाँच नहीं करने के लिए कह रहा था, लेकिन अगर आप जानते हैं कि आप इस मुद्दे पर नहीं चलेंगे, तो यह समाधान ठीक है, जैसा मैंने कहा था। लेकिन अनावश्यक downvote @syntaxerror के लिए धन्यवाद। यह समाधान कुछ के लिए काम करेगा, जैसा कि (वर्तमान में) 19 अपवोट्स दिखाएगा, लेकिन अगर यह नहीं है, तो अपने समाधान के लिए इसका उपयोग न करें। ओपी की समस्या को हल करने के कई तरीके हैं।
22

1
यदि आप अपने दैनिक कार्य में कमांड लाइन पर awk का उपयोग कर रहे हैं, तो यह निश्चित रूप से वह समाधान है जो आप चाहते हैं। क्या यह स्पष्ट नहीं है? त्रुटि जांच आदि, वास्तव में उस मामले में कोई फर्क नहीं पड़ता क्योंकि आप इसे टाइप कर रहे हैं और इन प्रकार की चीजों को पकड़ सकते हैं इससे पहले कि आप दबाते हैं (व्यक्तिगत रूप से, मुझे नहीं लगता कि awk को किसी और चीज के लिए इस्तेमाल किया जाना चाहिए, यही कारण है कि हम 'perl, python, tcl और लगभग 100+ अन्य, बेहतर, तेज, कम कष्टप्रद स्क्रिप्टिंग भाषाएं प्राप्त हुईं!)' कोर्स शायद Im मेरे साथी सॉफ्टवेयर डेवलपर्स को बहुत अधिक क्रेडिट दे रहा है और उन्हें वास्तव में उस सामान पर भी त्रुटि जाँच की आवश्यकता है जो वे टाइप करते हैं! on the fly (??)
ओसीरसिगोत्रा

11
sed -re 's,\s+, ,g' | cut -d ' ' -f 9-

चर चौड़ाई व्हाट्सएप से निपटने के बजाय, सभी व्हाट्सएप को सिंगल स्पेस के रूप में बदलें। फिर cutब्याज के क्षेत्रों के साथ सरल का उपयोग करें ।

यह awk का उपयोग नहीं करता है इसलिए जर्मे नहीं है, लेकिन अन्य उत्तरों / टिप्पणियों को देखते हुए उचित प्रतीत होता है।


1
कृपया अपने उत्तर को और अधिक रोमांचक बनाएं, अन्यथा इसे टिप्पणी के रूप में पोस्ट करें।
अल्पर तुरन

यह ps faux | उपयोग के लिए आदर्श है । उपकरण स्वीकार करने से कभी न डरें XYZ सबसे उपयुक्त नहीं है।
केविनफ

10

आम तौर पर perl की जगह awk / sed / grep et होती है। अल।, और बहुत अधिक पोर्टेबल है (और साथ ही सिर्फ एक बेहतर पेनकेन भी है)।

perl -lane 'print "@F[8..$#F]"'

टिमटॉवडी बेशक लागू होता है।


आपको कमांड लाइन विकल्प -lजोड़ने या \nप्रिंट स्टेटमेंट में जोड़ने की आवश्यकता है।
ग्लेन जैकमैन

@ जैगल जैकमैन: संभवतः। आवश्यकता नहीं है अगर किसी अन्य संदेश का हिस्सा है, या एक चर आदि को सौंपा जा रहा है, जहां तक ​​"बेहतर" जाता है, तो निश्चित रूप से पर्ल छोटे में बेहतर दिखता है। बड़े पैमाने पर भर्ती में बहुत अस्वाभाविक लग सकता है।
19

मुझे गलत मत समझो, मुझे पर्ल पसंद है। मैं हालांकि यह क्या है के लिए awk प्यार करता हूँ।
ग्लेन जैकमैन

मेरा एंबेडेड डिवाइस पर्ल के साथ नहीं आता है, लेकिन यह जागता है।
सेपरो

डाउनवोटिंग क्योंकि सवाल पूछा गया कि यह कैसे करना है, न कि पर्ल, रूबी, जावा, पाइथन, बैश।
टॉम हैरिसन

3
awk -v m="\x01" -v N="3" '{$N=m$N ;print substr($0, index($0,m)+1)}'

यह दी गई फील्ड nr।, N से पहले है, और क्षेत्र nr.N सहित सभी लाइन को प्रिंट करता है और मूल रिक्ति को बनाए रखता है (यह सुधार नहीं करता है)। यदि क्षेत्र का तार कहीं और पंक्ति में भी दिखाई देता है, तो यह मैटर नहीं करता है, जो कि असकर के उत्तर के साथ समस्या है।

एक फ़ंक्शन को परिभाषित करें:

fromField () { 
awk -v m="\x01" -v N="$1" '{$N=m$N; print substr($0,index($0,m)+1)}'
}

और इसे इस तरह से उपयोग करें:

$ echo "  bat   bi       iru   lau bost   " | fromField 3
iru   lau bost   
$ echo "  bat   bi       iru   lau bost   " | fromField 2
bi       iru   lau bost   

आउटपुट सब कुछ बनाए रखता है, जिसमें N के लिए रिक्त स्थान शामिल है = 0 के लिए यह पूरी लाइन को लौटाता है, जैसा कि है, और n> NF के लिए एक स्ट्रिंग है


यह एक अच्छा विचार है। यह एक मौजूदा मैक पर काम नहीं करता है विशिष्ट gawk का उपयोग करते हुए, क्योंकि $ 0 गिर जाता है। पहला कदम के रूप में एक चर को $ 0 पर सेट करना है, जैसे: '{s = $ 0; ... प्रिंट रूट (ओं, इंडेक्स (s, m) +1)
joelparkerhenderson

1

यहाँ ls -lआउटपुट का एक उदाहरण है :

-rwxr-----@ 1 ricky.john  1493847943   5610048 Apr 16 14:09 00-Welcome.mp4
-rwxr-----@ 1 ricky.john  1493847943  27862521 Apr 16 14:09 01-Hello World.mp4
-rwxr-----@ 1 ricky.john  1493847943  21262056 Apr 16 14:09 02-Typical Go Directory Structure.mp4
-rwxr-----@ 1 ricky.john  1493847943  10627144 Apr 16 14:09 03-Where to Get Help.mp4

कुछ भी पोस्ट छापने का मेरा समाधान $9हैawk '{print substr($0, 61, 50)}'



0

पहले 3 फ़ील्ड प्रदर्शित करने के लिए और शेष फ़ील्ड प्रिंट करने के लिए जिनका आप उपयोग कर सकते हैं:

awk '{s = ""; for (i=4; i<= NF; i++) s= s $i : "; print $1 $2 $3 s}' filename

जहां $ 1 $ 2 $ 3 पहले 3 क्षेत्र हैं।


0
function print_fields(field_num1, field_num2){
    input_line = $0

    j = 1;
    for (i=field_num1; i <= field_num2; i++){
        $(j++) = $(i);

    }
    NF = field_num2 - field_num1 + 1;
    print $0

    $0 = input_line
}

0

जाग के बजाय कट का उपयोग और -c चरित्र कटौती आदेश का उपयोग करके शुरू करने के लिए कौन सा कॉलम पता लगाने के साथ मुद्दों पर काबू पाने।

यहाँ मैं कह रहा हूँ, मुझे आउटपुट के पहले ४ ९ अक्षर दें।

 ls -l /some/path/*/* | cut -c 50-

/*/*/Ls कमांड के अंत में मुझे शो क्या उपनिर्देशिका में भी है कह रहा है।

आप वर्णों की कुछ श्रेणियों को अलग भी कर सकते हैं (कट मैन पेज से)। उदाहरण के लिए, वर्तमान में लॉग किए गए उपयोगकर्ताओं के नाम और लॉगिन समय दिखाएं:

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