मैं बैश के साथ प्रत्येक पंक्ति में अंतिम शब्द कैसे प्राप्त कर सकता हूं


80

उदाहरण के लिए मेरे पास एक फाइल है:

$ cat file

i am the first example.

i am the second line.

i do a question about a file.

और मुझे आवश्यकता है:

example, line, file

मैं "जाग" के साथ आशय रखता हूं लेकिन समस्या यह है कि शब्द अलग-अलग जगह पर हैं


1
आपकी "दूसरी पंक्ति" खाली रेखाओं के कारण दूसरी पंक्ति पर नहीं है, कृपया भविष्य में कम अस्पष्ट उदाहरण दें।
एड्रियन फ्रुविर्थ

जवाबों:


93

प्रयत्न

$ awk 'NF>1{print $NF}' file
example.
line.
file.

अपने उदाहरण के अनुसार एक पंक्ति में परिणाम प्राप्त करने के लिए, प्रयास करें:

{
    sub(/\./, ",", $NF)
    str = str$NF
}
END { print str }

उत्पादन:

$ awk -f script.awk file
example, line, file, 

शुद्ध बैश:

$ while read line; do [ -z "$line" ] && continue ;echo ${line##* }; done < file
example.
line.
file.

@Fredrik Pihl, क्या आप प्रत्येक कोड अनुभाग में स्पष्टीकरण जोड़ सकते हैं, जैसे: "यह कोड मुद्रण द्वारा awk द्वारा प्राप्त अंतिम फ़ील्ड को प्रिंट करता है $NF"?
अलेक्सज मगुरा

क्या आप इको $ {लाइन ## *} समझा सकते हैं;
code4cause

1
@ code4cause - just goto gnu.org/software/bash/manual/bash.html और ##शेल में इसे खोजें या इसके लिए प्रयास करें।
फ्रेड्रिक पिहल

सिर्फ एक शब्द होने पर कुछ नहीं लौटता। $ गूंज "फू" | awk 'NF> 1 {प्रिंट $ NF}' $
एथान पोस्ट

85

आप इसे grep के साथ आसानी से कर सकते हैं:

grep -oE '[^ ]+$' file

( -Eविस्तारित रेगेक्स का उपयोग करें; -oपूर्ण पंक्ति के बजाय केवल मिलान किए गए पाठ का उत्पादन करें)


3
यह होना चाहिए grep -oE '[^ ]+$', आप ब्राउज़र व्यवहार के कारण यहां टैब देखना चाहते हैं, लेकिन वैसे भी, यह टैब रिक्त स्थान के रूप में अच्छी तरह से विचार करता है, या बेहतर अभी तक आप कर सकते हैंgrep -oE '[^[:space:]]+$'
नाबिल कादिमी जूल


12

सादे कटोरे में ऐसा करने का एक और तरीका इस revतरह से कमांड का उपयोग कर रहा है :

cat file | rev | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","

मूल रूप से, आप फ़ाइल की पंक्तियों को उल्टा करते हैं, फिर उन्हें cutसीमांकक के रूप में स्थान का उपयोग करके विभाजित करें , cutउत्पादन करने वाले पहले क्षेत्र को लें और फिर आप फिर से टोकन को रिवर्स करें, tr -dअवांछित वर्णों को हटाने के लिए उपयोग करें।tr फिर से newline वर्णों को बदलने के लिए,

इसके अलावा, आप पहली बिल्ली को करने से बच सकते हैं:

rev < file | cut -d" " -f1 | rev | tr -d "." | tr "\n" ","

यह बहुत सरल उपाय है! मैं सोच की सराहना करता हूं!
कप्तान वूफ

6

बहुत से रास्ते हैं। जैसाawk समाधान दिखाता है, यह साफ समाधान है

अंतिम स्थान तक कुछ भी हटाने के लिए sed समाधान है। इसलिए अगर अंत में कोई जगह नहीं है, तो यह काम करना चाहिए

sed 's/.* //g' <file>

आप sedभी बच सकते हैं और एक whileपाश के लिए जा सकते हैं ।

while read line
do [ -z "$line" ] && continue ;
echo $line|rev|cut -f1 -d' '|rev
done < file

यह एक पंक्ति को पढ़ता है, इसे वापस करता है, पहले (मूल में अंतिम) को काटता है और वापस पुनर्स्थापित करता है

वही शुद्ध बैश तरीके से किया जा सकता है

while read line
do [ -z "$line" ] && continue ;
echo ${line##* }
done < file

इसे पैरामीटर विस्तार कहा जाता है


6

tldr;

$ awk '{print $NF}' file.txt | paste -sd, | sed 's/,/, /g'

इस तरह एक फ़ाइल के लिए

$ cat file.txt
The quick brown fox
jumps over
the lazy dog.

दिया गया कमांड प्रिंट होगा

fox, over, dog.

यह काम किस प्रकार करता है:

  • awk '{print $NF}' : हर पंक्ति के अंतिम क्षेत्र को प्रिंट करता है
  • paste -sd,: stdinधारावाहिक पढ़ता है ( -s, एक समय में एक फ़ाइल) और फ़ील्ड लिखता है अल्पविराम-सी (-d, )
  • sed 's/,/, /g': substrates के ","साथ", " g lobally (सभी उदाहरणों के लिए)

संदर्भ:


हालांकि यह कोड प्रश्न का उत्तर दे सकता है, लेकिन क्यों और / या कैसे इस कोड के उत्तर के बारे में अतिरिक्त संदर्भ प्रदान करता है, इससे इसके दीर्घकालिक मूल्य में काफी सुधार होगा। कृपया कुछ स्पष्टीकरण जोड़ने के लिए अपने उत्तर को संपादित करें।
टोबे स्पीट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.