अंत से टेक्स्ट लाइन की गिनती से फ़ील्ड कैसे काटें (चयन करें)?


32

मुझे पता है कि कट कमांड का उपयोग करके लाइन से फ़ील्ड कैसे चुनें। उदाहरण के लिए, निम्न डेटा दिया गया है:

a,b,c,d,e
f,g,h,i,j
k,l,m,n,o

यह आदेश:

cut -d, -f2 # returns the second field of the input line

यह दिखाता है:

b
g
l

मेरा प्रश्न: मैं अंत से दूसरे क्षेत्र की गिनती कैसे चुन सकता हूं ? पिछले उदाहरण में, परिणाम होगा:

d
i
n

जवाबों:


52

पहले और बाद में इनपुट रिवर्स cutके साथ rev:

<infile rev | cut -d, -f2 | rev

आउटपुट:

d
i
n

1
मेरे बिन फ़ोल्डर में कई छोटे स्निपेट हैं। rcut इस के लिए ठीक है: #! / bin / bash Rev | कट "$ @" | Rev
जॉन ऑलसअप

2
यह बहुत बुरा है cutनकारात्मक क्षेत्र सूचकांकों (जैसे पायथन) को नहीं ले सकता।
कीथ डेवेंस

10

साथ ऐसा करने का प्रयास करें :

awk -F, '{print $(NF-1)}' file.txt

या का उपयोग कर :

perl -F, -lane 'print $F[-2]' file.txt

या का उपयोग कर (धन्यवाद मैनेटवर्क):

ruby -F, -lane 'print $F[-2]' file.txt

या उपयोग bash(धन्यवाद manatwork):

while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt

या उपयोग कर रहे हैं :

cat file.txt |
python -c $'import sys\nfor line in sys.stdin:\tprint(line.split(",")[-2])'

1
bashइसके लिए निश्चित कॉलम संख्या की आवश्यकता नहीं है while IFS=, read -ra d; do echo "${d[-2]}"; done < file.txt:।
१५

1
यदि आप के perlसाथ बदलते हैं तो BTW, आपका तीसरा समाधान भी काम करता है ruby
15

धन्यवाद, rubyजोड़ा, bashसंपादित।
गाइल्स क्वेनोट

1
यदि 4 वें क्षेत्र के साथ शुरू हो सकता है -या (पर्यावरण, शेल, या शेल को कैसे संकलित किया गया है) के आधार पर, बैकस्लैश वर्ण हो सकते हैं, तो echoविकल्प नहीं है। आप चोर की जरूरत क्यों catEnate file.txtसाथ कुछ भी नहीं करने के लिए इसे खिलाने से पहले python!?। आप की जरूरत read -Aके बजाय read -aमें ksh93और zsh। नकारात्मक सबस्क्रिप्ट में काम करते हैं zsh, लेकिन केवल के हाल के संस्करणों में ksh93और bash। पुराने संस्करणों में, आप उपयोग कर सकते हैं${d: -2:1}
स्टीफन चेज़लस

2
@StephaneChazelas, मुझे लगता है कि आपको ${d[@]: -2:1}अपने अंतिम वाक्य में मतलब है।
manatwork

0

Sed का उपयोग करना:

sed -E 's/^([^,]*,)*([^,]*)(,[^,]*){1}$/\2/' infile

आउटपुट:

d
i
n

व्याख्या

  • ([^,]*,)* किसी भी संख्या में स्तंभों की संख्या के बाद, किसी भी संख्या में गैर-अल्पविराम सुधारक से मेल खाता है।
  • ([^,]*) एक कॉलम से मेल खाता है।
  • (,[^,]*){1}एक कॉलम को अंत में मैच करता है, अगर आप क्वांटिफायर {1}को बदलते हैं तो {2}वह दूसरे कॉलम को अंत से मैच करता है आदि।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.