दो इको कमांड के आउटपुट के बीच \ n कैसे निकालें?


13

मेरे पास एक पाठ फ़ाइल है जिसमें प्रत्येक पंक्ति में एक फ़ाइल नाम है:

111_c4l5r120.png
123_c4l4r60.png
135_c4l4r180.png
147_c4l3r60.png
15_c4l1r120.png
...

मैं इसे इस आकृति में बदलना चाहता हूं:

111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15
...

इस कोड का उपयोग करना:

#!/bin/bash
while IFS='' read -r line || [[  -n "$line"  ]]; do
   echo "$line" >> output.txt   
   echo "$line" | cut -d'_' -f 1 >> output.txt
done < "$1"

लेकिन, परिणाम है:

111_c4l5r120.png 
111
123_c4l4r60.png 
123
135_c4l4r180.png 
135
147_c4l3r60.png 
147
15_c4l1r120.png 
15
...

इच्छा आउटपुट करने के लिए मुझे अपनी स्क्रिप्ट कैसे बदलनी चाहिए?


Google को इसके बेहतर परिणाम मिलते हैं, जैसे, यह
थॉमस डिक्की

जवाबों:


17

जब तक आपको इसके लिए शेल का उपयोग करने की कोई विशिष्ट आवश्यकता नहीं है, टेर्डन का जवाब बेहतर विकल्प प्रदान करता है।

चूंकि आप उपयोग कर रहे हैं bash(जैसा कि स्क्रिप्ट के शबंग में दर्शाया गया है), आप -nगूंजने के लिए विकल्प का उपयोग कर सकते हैं :

echo -n "${line} " >> output.txt
echo "$line" | cut -d'_' -f 1 >> output.txt

या आप बिना उपयोग किए लाइन को प्रोसेस करने के लिए शेल फीचर्स का उपयोग कर सकते हैं cut:

echo "${line} ${line%%_*}" >> output.txt

(दोनों echoलाइनों की जगह )।

वैकल्पिक रूप से, printfचाल भी करेगा, किसी भी POSIX शेल में काम करता है , और आम तौर पर बेहतर है (देखें कि गूंज की तुलना में प्रिंटफ़ क्यों है? विवरण के लिए):

printf "%s " "${line}" >> output.txt
echo "$line" | cut -d'_' -f 1 >> output.txt

या

printf "%s %s\n" "${line}" "${line%%_*}" >> output.txt

( स्पष्ट रूप से /bin/sh, सादे रूप में , echo -nपोर्टेबल नहीं है । चूंकि आप स्पष्ट रूप से bashइसका उपयोग यहां कर रहे हैं।)


टिप्पणियाँ विस्तारित चर्चा के लिए नहीं हैं; इस वार्तालाप को बातचीत में स्थानांतरित कर दिया गया है ।
terdon

23

खोल में इस तरह की बात मत करो! यह आवश्यक से कहीं अधिक जटिल है, त्रुटियों और दूर, बहुत धीमा होने की संभावना है। ऐसे पाठ हेरफेर के लिए कई उपकरण डिज़ाइन किए गए हैं। उदाहरण के लिए, sed(यहाँ हाल ही में GNU या BSD कार्यान्वयन के लिए -E):

$ sed -E 's/([^_]*).*/& \1/' file
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15

या, किसी के लिए sed:

$ sed 's/\([^_]*\).*/& \1/' file
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15

पर्ल:

$ perl -pe 's/(.+?)_.*/$& $1/' file
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15

awk:

$ awk -F_ '{print $0,$1}' file
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15

1
बाहरी उपयोगिताओं हालांकि ज्यादा बेहतर नहीं हैं।
इकोनस

6
@ ΥριΈνσταντόποςλο they हाँ वे हैं। वास्तव में तीव्रता के कई आदेश, वास्तव में। शेल इस तरह की बात पर बहुत अच्छा नहीं है। एक शेल का मुख्य काम बाहरी उपयोगिताओं को लॉन्च करना है, आखिरकार। ओपी के दृष्टिकोण द्वारा किए गए समय की तुलना यहां के किसी भी समाधान द्वारा की गई है। शेल लूप बहुत, बहुत धीमे हैं। यदि आपको अधिक समझाने की आवश्यकता है, तो इसे पढ़ें ।
terdon

पोर्टेबिलिटी के संदर्भ में, नप। गति के मामले में, हाँ। इसके अलावा, @ StéphaneChazelas आपका उपनाम है?
इकोन्स

4
@ ΥριΈνσταντόποςλοΘ'α 'Έλα :) नहीं, वह सिर्फ दो महान उत्तर लिखने के लिए होता है जो दो टिप्पणी सूत्र के लिए प्रासंगिक थे। पोर्टेबिलिटी के लिए, पेरल एप्रोच के (मामूली) अपवाद के साथ, जो केवल ~ 90% * निक्स मशीनों की तरह कुछ पर काम करेगा, तीनों समाधान पोर्टेबल और शेल अज्ञेयवादी हैं। या, ठीक है, आप हमेशा अतिरिक्त पोर्टेबिलिटी के लिए sedएक बना सकते हैं sed 's/\([^_]*\).*/& \1/' file। बिंदु है, आप पर भरोसा कर सकते हैं awkऔर sedवहाँ अधिक से अधिक आप कुछ और बहुत कुछ पर भरोसा कर सकते हैं।
terdon

2

आप यहाँ हैं:

#!/bin/bash

while IFS='' read -r line || [[  -n "$line"  ]]; do
   echo "$line" `echo "$line" | cut -d'_' -f 1` >> output.txt
#   echo "$line" | cut -d'_' -f 1 >> output.txt
done < "$1"

आउटपुट:

$ rm -rf output.txt
$ ./test.sh 1.1; cat output.txt
111_c4l5r120.png 111
123_c4l4r60.png 123
135_c4l4r180.png 135
147_c4l3r60.png 147
15_c4l1r120.png 15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.