Awk का उपयोग करके अंतिम दो कॉलम कैसे प्रिंट करें


106

मैं चाहता हूं कि पिछले दो कॉलम छपे हैं।


6
यह निश्चित नहीं है कि इसमें 87 अप क्यों हैं, यह निश्चित रूप से बहुत कम से कम एक उदाहरण के साथ सुधारा जा सकता है।
अरज

शायद इसलिए कि यह प्रश्न प्रकृति द्वारा बेहद सरल है और आसानी से बिना उदाहरण के समझा जा सकता है, जो दुर्लभ है, लेकिन इस मामले में यह काम करता है। यहां समस्या मेरे विचार से जानकारी की कमी नहीं है, बल्कि इससे अधिक है कि यह स्वतंत्र अनुसंधान की कमी को दर्शाता है।
ड्रायलैब्रेल

यह सवाल भी का डुप्लिकेट है इस सवाल।
ड्रायलैब्रेल

क्या इससे आपके सवाल का जवाब मिलता है?
Awk

जवाबों:


194

आप चर का उपयोग कर सकते हैं NFजो इनपुट रिकॉर्ड में फ़ील्ड की कुल संख्या पर सेट है:

awk '{print $(NF-1),"\t",$NF}' file

यह मानता है कि आपके पास कम से कम 2 क्षेत्र हैं।


1
आपको अल्पविराम की आवश्यकता है - चूँकि हम आज पिकी जा रहे हैं: अंतरिक्ष, खेतों को समतल करता है, अल्पविराम एक वक्तव्य में खेतों को अलग करता है। यह दोनों क्षेत्रों
जिम् mcnamara

18
अब आप "फ़ील्ड-ओएनएस-टैब-ओएनएस-फ़ील्ड" प्रिंट कर रहे हैं। यह होना चाहिए awk '{print $(NF-1) "\t" $NF}' fileया awk '{print $(NF-1), $NF}' fileया awk 'BEGIN{OFS="\t"} {print $(NF-1), $NF}' file
अगली सूचना तक रोक दिया गया।

बस पिछली टिप्पणी में जोड़ने के लिए, का उपयोग करने के साथ समस्या '{print $x,"\t",$y}'यह है कि awk प्रत्येक अल्पविराम से अलग चर की व्याख्या करता है क्योंकि यह स्वयं का क्षेत्र है, इसलिए परिणाम वास्तव में होगा field1<space><tab><space>field2, (क्योंकि यह डिफ़ॉल्ट रूप से सफेद स्थान के सीमांकक का उपयोग करेगा) field1<tab>field2जिसका विरोध संभवतः है आप उम्मीद कर रहे हैं आउटपुट फील्ड सेपरेटर (OFS) का उपयोग करना लगभग हमेशा वही होता है जो आप चाहते हैं।
ड्राईलैब्रेल

13
awk '{print $NF-1, $NF}'  inputfile

नोट: यह तभी काम करता है जब कम से कम दो कॉलम मौजूद हों। एक कॉलम के साथ रिकॉर्ड करने पर आपको एक प्रेरणा मिलेगी"-1 column1"


3
कोशिश करो और देखो। यह Solaris 9 awk & nawk काम करता है। इसका विकल्प $ (NF-1) है
jim mcnamara

1
@coaddict - मुझे लगता है कि आपने अलग-अलग awk कार्यान्वयन के साथ काम नहीं किया है। पुराने होश व्यवहार (शायद गलती से) आगे लाया गया है। मेरे पास परीक्षण करने के लिए gawk नहीं है - जो शायद आप संदर्भित कर रहे हैं। इसलिए मुझे नहीं पता कि आपकी टिप्पणी असामान्य क्यों है। आमतौर पर बॉक्स के बाहर लिनक्स गॉक होता है। मैं परीक्षण कर वापस भेज दूंगा। इस बीच Soalris या HPUX या DGX या जो कुछ भी मैं पुराने awk से मतलब है देखने के लिए प्रयास करें।
जिम mcnamara

6
आप शायद यह सोचकर चकरा गए कि यह आपके काम आया echo 1 2 3 | awk ...$NF-1है ($NF) - 1हर में awkकार्यान्वयन।
स्टीफन चेजलस

"वन ट्रू ऑक" स्रोत कोड में yaccव्याकरण में 40 से अधिक संघर्ष हैं , जो विडंबना है कि ए क्या जाग में खड़ा है। Awk पार्सिंग चीजों के अलग-अलग संस्करण अलग-अलग हैं? बड़ा आश्चर्य!
काज

1
@THESorcerer, के साथ प्रयास करें echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'- या कोई अन्य इनपुट जहां 2 अंतिम फ़ील्ड अंतिम फ़ील्ड से कम नहीं है।
ग्लेन जैकमैन

6

@jim मैकन्मारा: चारों ओर के लिए कोष्ठक का उपयोग करके देखें NF, यानी $(NF-1)और $(NF)के बजाय $NF-1और $NF(FreeBSD के लिए पर मैक ओएस एक्स 10.6.8 काम करता है awkऔर gawk)।

echo '
1 2
2 3
one
one two three
' | gawk '{if (NF >= 2) print $(NF-1), $(NF);}'

# output:
# 1 2
# 2 3
# two three

हमने पहले ही () पहले ही विचार कर लिया था। मुझे लगा कि हम चर्चा कर रहे हैं कि मूल पुराना अजीब व्यवहार कहां से आया है।
jim mcnamara

स्पष्ट के साथ एक जवाब के लिए +1 $(NF-1)- जो बहुत कम से कम पोर्टेबल है $NF-1; यह निश्चित रूप से कम अस्पष्ट है। $(NF)ओवरकिल है, हालांकि - बस $NFकरेंगे। 2 से कम कॉलम वाली लाइनों की सुरक्षा करना भी सार्थक है, क्योंकि एक-कॉलम वाली लाइनों के साथ आपको पहले कॉलम का मूल्य दो बार मिलेगा , और शून्य-कॉलम के साथ - अर्थात, खाली - लाइनों को एक कमांड के कारण पूरी तरह से विफल हो जाएगा। सूचकांक -1 के साथ एक क्षेत्र का उपयोग करने के लिए।
mklement0

1

gawk के उपयोग से समस्या प्रदर्शित होती है:

 gawk '{ print $NF-1, $NF}' filename
1 2
2 3
-1 one
-1 three
# cat filename
1 2
2 3
one
one two three

मैं सिर्फ सोलारिस 10 M4000 पर gawk लगाता हूं: इसलिए, gawk $ NF-1 बनाम $ (NF-1) मुद्दे पर कपल है। अगला सवाल POSIX क्या कहता है? प्रति:

http://www.opengroup.org/onlinepubs/009695399/utilities/awk.html

कोई एक दिशा या दूसरा रास्ता नहीं है। अच्छा नही। gawk का अर्थ है घटाव, अन्य आवेगों की संख्या क्षेत्र या घटाव है। हम्म।


1
अपने नमूना इनपुट फ़ाइल के पहले 2 लाइनों में है कि वे के साथ एक ही उत्पादन का उत्पादन उपयोगी नहीं हैं या तो व्यवहार। क्या आप इस बात की पुष्टि कर सकते हैं कि सोलारिस जाग वास्तव में इस मामले में गौक की तरह व्यवहार नहीं करता है?
mklement0

Awk स्पेक के लिए आपके लिंक के रूप में: उपयोग करने के लिए वास्तविक तर्क $(NF-1)यह है कि कल्पना में फ़ील्ड इंडेक्स की दो मिसालें दोनों उस फॉर्म का उपयोग करती हैं: $(NF-1)और $(NF+2)। फिर "एक्सप्रेशंस इन अडक" सेक्शन है, जो सूची $exprमें है [होने] की तुलना में बहुत अधिक है expr - expr। चूंकि NFस्वयं एक अभिव्यक्ति है, इसलिए $NF-1मूल्यांकन करना चाहिए ($NF)-1। यहां तक ​​कि अगर, आखिरकार, वहाँ वास्तव में जागृत कार्यान्वयन हैं जो कि मूल्यांकन $NF-1करते हैं $(NF-1), यहां सीखा गया सबक यह है कि उपयोग $(NF-1)करना सुरक्षित और पोर्टेबल विकल्प है।
mklement0

0

इसके साथ प्रयास करें

$ cat /tmp/topfs.txt
/dev/sda2      xfs        32G   10G   22G  32% /

awk print last column
$ cat /tmp/topfs.txt | awk '{print $NF}'

awk print before last column
$ cat /tmp/topfs.txt | awk '{print $(NF-1)}'
32%

awk - print last two columns
$ cat /tmp/topfs.txt | awk '{print $(NF-1), $NF}'
32% /

0

कृपया सभी संभावित परिदृश्यों को ध्यान में रखते हुए इसे आज़माएँ:

awk '{print $(NF-1)"\t"$NF}'  file

या

awk 'BEGIN{OFS="\t"}' file

या

awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.