Awk में दूसरा अंतिम कॉलम / फील्ड प्रिंट करें


164

मैं awk में दूसरा आखिरी कॉलम या फील्ड प्रिंट करना चाहता हूं। खेतों की संख्या परिवर्तनशील है। मुझे पता है कि मुझे इसका उपयोग करने में सक्षम होना चाहिए, $NFलेकिन यह सुनिश्चित नहीं करना चाहिए कि इसका उपयोग कैसे किया जा सकता है।

और यह काम नहीं करता है:

awk ' { print ( $NF-- )  } '

10
NFअंतिम फ़ील्ड इंडेक्स है, अंतिम फ़ील्ड $NFका मान है
ग्लेन जैकमैन

अब समझ में आता है। कोष्ठक के बाहर डॉलर क्यों काम करता है मुझे लगता है
ब्रायन जी

जवाबों:


279
awk '{print $(NF-1)}'

कार्य करना चाहिए


2
यह मेरे लिए काम नहीं करता है। मुझे "शीर्षक: 5: कमांड नहीं मिली: एनएफ -1" उबंटू में 3.1.8 के नीचे।
गुरजिएफ

3
मैं यह सुनिश्चित करने के लिए पूर्व / बाद में कमी से बचूंगा कि आप $ NF के मूल्य में बदलाव न करें
ग्रेगरी पटमोर

यह टूट जाता है यदि आप तीसरे अंतिम क्षेत्र को पाने की कोशिश करते हैं जैसेawk -F '.' '{print $(NF-2)}'
gies0r

3
@Gurgeh: ऐसा इसलिए होता है क्योंकि $(..)आप जिस शेल का उपयोग कर रहे हैं, उसके आधार पर एक सब-कमांड में एक कमांड देता है। के $ (NF-1)बजाय का उपयोग करके आप इसके चारों ओर काम कर सकते हैं $(NF-1)
wting

21

क्रिस कन्नन के स्वीकृत उत्तर के अलावा छोटा: केवल तभी प्रिंट करें यदि वास्तव में दूसरा अंतिम कॉलम है।

(
echo       | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1     | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2   | awk 'NF && NF-1 { print ( $(NF-1) ) }'
echo 1 2 3 | awk 'NF && NF-1 { print ( $(NF-1) ) }'
)

15

यह सबसे सरल है:

 awk '{print $--NF}' 

मूल $NF--काम नहीं करने का कारण यह है कि अभिव्यक्ति का मूल्यांकन वेतन वृद्धि से पहले किया जाता है, जबकि मूल्यांकन से पहले मेरा उपसर्ग घटाना किया जाता है।


एक महामारी के रूप में, यह व्यवहार C / Java आदि के समान है int x = ++i int x = i++, उपसर्ग का अर्थ है पहले वेतन वृद्धि; पोस्टफिक्स का मतलब बाद में वेतन वृद्धि (पहले असाइनमेंट) है।
वीकेंड


4

आप परिणाम से दूर नहीं थे! यह यह करता है:

awk '{NF--; print $NF}' file

यह एक में फ़ील्ड्स की संख्या को घटाता है, जिससे कि $NFपूर्व की कलमबद्धता होती है।

परीक्षा

आइए कुछ संख्याएँ उत्पन्न करें और उन्हें 5 के समूहों पर प्रिंट करें:

$ seq 12 | xargs -n5
1 2 3 4 5
6 7 8 9 10
11 12

आइए प्रत्येक पंक्ति पर प्रिन्टिमल प्रिंट करें:

$ seq 12 | xargs -n5 | awk '{NF--; print $NF}'
4
9
11

3

पर्ल कन्नन के जाग समाधान के समान पर्ल समाधान:

perl -lane 'print $F[$#F-1]' file

इन कमांड-लाइन विकल्पों का उपयोग किया जाता है:

  • n इनपुट फ़ाइल की प्रत्येक पंक्ति के चारों ओर लूप, स्वचालित रूप से प्रत्येक पंक्ति को प्रिंट न करें

  • l प्रसंस्करण से पहले नए सिरे को हटाता है, और बाद में उन्हें वापस जोड़ता है

  • aऑटोसप्लिट मोड - @Fसरणी में इनपुट लाइनों को विभाजित करें । व्हॉट्सएप पर बंटवारे की चूक

  • e पर्ल कोड निष्पादित करें

@FAutosplit सरणी सूचकांक पर शुरू होता है [0] awk क्षेत्रों $ 1 के साथ शुरू करते हैं।
$#Fतत्वों की संख्या है@F


1
या ऋणात्मक अनुक्रमण का उपयोग पहले से ही perl द्वारा प्रदान किया गया ...$F[-2]
Sundeep

2

क्या आपने रेवा कमांड का उपयोग करके दाएं से बाएं शुरू करने की कोशिश की? इस स्थिति में आपको केवल 2 कॉलम प्रिंट करना होगा:

seq 12 | xargs -n5 | rev | awk '{ print $2}' | rev
4
9
11

1

पहले मूल्य को घटाता है और फिर उसे प्रिंट करता है -

awk ' { print $(--NF)}' file

या

rev file|cut -d ' ' -f2|rev

0

यदि आपके पास कई कॉलम हैं और सभी प्रिंट करना चाहते हैं, लेकिन आखिरी में तीन बादल नहीं हैं, तो यह मदद कर सकता है

awk '{ $NF="";$(NF-1)="";$(NF-2)="" ; print $0 }'

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