मैं चाहता हूं कि पिछले दो कॉलम छपे हैं।
मैं चाहता हूं कि पिछले दो कॉलम छपे हैं।
जवाबों:
आप चर का उपयोग कर सकते हैं NF
जो इनपुट रिकॉर्ड में फ़ील्ड की कुल संख्या पर सेट है:
awk '{print $(NF-1),"\t",$NF}' file
यह मानता है कि आपके पास कम से कम 2 क्षेत्र हैं।
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) का उपयोग करना लगभग हमेशा वही होता है जो आप चाहते हैं।
awk '{print $NF-1, $NF}' inputfile
नोट: यह तभी काम करता है जब कम से कम दो कॉलम मौजूद हों। एक कॉलम के साथ रिकॉर्ड करने पर आपको एक प्रेरणा मिलेगी"-1 column1"
echo 1 2 3 | awk ...
। $NF-1
है ($NF) - 1
हर में awk
कार्यान्वयन।
yacc
व्याकरण में 40 से अधिक संघर्ष हैं , जो विडंबना है कि ए क्या जाग में खड़ा है। Awk पार्सिंग चीजों के अलग-अलग संस्करण अलग-अलग हैं? बड़ा आश्चर्य!
echo '5 4 3 2 1' | awk '{print $NF-1,$NF; print $(NF-1), $NF}'
- या कोई अन्य इनपुट जहां 2 अंतिम फ़ील्ड अंतिम फ़ील्ड से कम नहीं है।
@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
$(NF-1)
- जो बहुत कम से कम पोर्टेबल है $NF-1
; यह निश्चित रूप से कम अस्पष्ट है। $(NF)
ओवरकिल है, हालांकि - बस $NF
करेंगे। 2 से कम कॉलम वाली लाइनों की सुरक्षा करना भी सार्थक है, क्योंकि एक-कॉलम वाली लाइनों के साथ आपको पहले कॉलम का मूल्य दो बार मिलेगा , और शून्य-कॉलम के साथ - अर्थात, खाली - लाइनों को एक कमांड के कारण पूरी तरह से विफल हो जाएगा। सूचकांक -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 का अर्थ है घटाव, अन्य आवेगों की संख्या क्षेत्र या घटाव है। हम्म।
$(NF-1)
यह है कि कल्पना में फ़ील्ड इंडेक्स की दो मिसालें दोनों उस फॉर्म का उपयोग करती हैं: $(NF-1)
और $(NF+2)
। फिर "एक्सप्रेशंस इन अडक" सेक्शन है, जो सूची $expr
में है [होने] की तुलना में बहुत अधिक है expr - expr
। चूंकि NF
स्वयं एक अभिव्यक्ति है, इसलिए $NF-1
मूल्यांकन करना चाहिए ($NF)-1
। यहां तक कि अगर, आखिरकार, वहाँ वास्तव में जागृत कार्यान्वयन हैं जो कि मूल्यांकन $NF-1
करते हैं $(NF-1)
, यहां सीखा गया सबक यह है कि उपयोग $(NF-1)
करना सुरक्षित और पोर्टेबल विकल्प है।
इसके साथ प्रयास करें
$ 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% /
कृपया सभी संभावित परिदृश्यों को ध्यान में रखते हुए इसे आज़माएँ:
awk '{print $(NF-1)"\t"$NF}' file
या
awk 'BEGIN{OFS="\t"}' file
या
awk '{print $(NF-1), $NF} {print $(NF-1), $NF}' file