उदाहरण के लिए मेरे पास एक फाइल है:
$ cat file
i am the first example.
i am the second line.
i do a question about a file.
और मुझे आवश्यकता है:
example, line, file
मैं "जाग" के साथ आशय रखता हूं लेकिन समस्या यह है कि शब्द अलग-अलग जगह पर हैं
उदाहरण के लिए मेरे पास एक फाइल है:
$ cat file
i am the first example.
i am the second line.
i do a question about a file.
और मुझे आवश्यकता है:
example, line, file
मैं "जाग" के साथ आशय रखता हूं लेकिन समस्या यह है कि शब्द अलग-अलग जगह पर हैं
जवाबों:
प्रयत्न
$ 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.
$NF"?
##शेल में इसे खोजें या इसके लिए प्रयास करें।
आप इसे grep के साथ आसानी से कर सकते हैं:
grep -oE '[^ ]+$' file
( -Eविस्तारित रेगेक्स का उपयोग करें; -oपूर्ण पंक्ति के बजाय केवल मिलान किए गए पाठ का उत्पादन करें)
grep -oE '[^ ]+$', आप ब्राउज़र व्यवहार के कारण यहां टैब देखना चाहते हैं, लेकिन वैसे भी, यह टैब रिक्त स्थान के रूप में अच्छी तरह से विचार करता है, या बेहतर अभी तक आप कर सकते हैंgrep -oE '[^[:space:]]+$'
आप कुछ इस तरह से जाग सकते हैं:
awk '{ print $NF }'
संपादित करें: खाली लाइन से बचने के लिए:
awk 'NF{ print $NF }'
सादे कटोरे में ऐसा करने का एक और तरीका इस 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" ","
बहुत से रास्ते हैं। जैसा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
इसे पैरामीटर विस्तार कहा जाता है
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 (सभी उदाहरणों के लिए)संदर्भ: