Xargs का फॉर्मेट आउटपुट


10

मैं आउटपुट xargs डिस्प्ले के प्रारूप को बदलना चाहूंगा

cat k.txt 
1 
2 
3 

तथा

cat k.txt | xargs 
1 2 3

हालाँकि मैं 1, 2, 3या करना चाहूँगा 1|2|3। कोई सुझाव?


कि कुछ के साथ हासिल किया जा सकता है (बिल्कुल नहीं) जैसे xargs cat -n, लेकिन अगर आप सिर्फ नए अक्षरों को ट्रिम करते हैं, तो इसे हासिल किया जा सकता है echo $(cat), grepया awkइसे करने का तरीका क्रॉल कर सकते हैं)। xargsअपने वर्तमान उद्देश्य के लिए अच्छी तरह से फिट नहीं है।
41754

जवाबों:


18

नीचे एक दर्जन या तो उदाहरण दिए गए हैं कि आप इस तरह से फ़ाइल कैसे ले सकते हैं:

$ cat k.txt
1
2
3

और इसे इस प्रारूप में बदलें:

1,2,3

आप इस कमांड का उपयोग उपरोक्त फाइल बनाने के लिए कर सकते हैं यदि आप साथ खेलना चाहते हैं:

$ cat <<EOF > k.txt
1
2
3
EOF

नीचे दिए गए उदाहरण 2 समूहों में विभाजित हैं। "काम" और लोगों को "लगभग" काम करने वाले लोग। मैं इन्हें छोड़ देता हूं क्योंकि अक्सर यह देखने के लिए मूल्यवान होता है कि कुछ काम क्यों नहीं करता है, क्योंकि यह देखना है कि कुछ क्यों करता है।

अधिकांश स्क्रिप्टिंग भाषाएं जिनसे मैं परिचित हूं उनका प्रतिनिधित्व किया जाता है। कुछ को कई बार दर्शाया जाता है, क्योंकि आमतौर पर पर्ल, TIMTOWTDI में संदर्भित प्रसिद्ध संक्षिप्त नाम के साथ ।

नोट: आप ,नीचे दिए गए उदाहरणों में अल्पविराम ( ) को स्वैप कर सकते हैं और इसे अपने इच्छित वर्णों के साथ बदल सकते हैं, अर्थात |

उदाहरण है कि "काम"

ये कोड स्निपेट्स वांछित आउटपुट का उत्पादन करेंगे।

pasteआदेश:

$ paste -s -d ',' k.txt 
1,2,3

sedआदेश:

$ sed ':a;N;$!ba;s/\n/,/g' k.txt
1,2,3

$ sed ':a;{N;s/\n/,/};ba' k.txt 
1,2,3

perlआदेश:

$ perl -00 -p -e 's/\n(?!$)/,/g' k.txt
1,2,3

$ perl -00 -p -e 'chomp;tr/\n/,/' k.txt
1,2,3

awkआदेश:

$ awk '{printf"%s%s",c,$0;c=","}' k.txt
1,2,3

$ awk '{printf "%s,",$0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

$ awk -vORS=, 1 k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

$ awk 'BEGIN {RS="dn"}{gsub("\n",",");print $0}' k.txt | awk '{sub(/\,$/,"");print}'
1,2,3

pythonआदेश:

$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,3

$ python -c "import sys; print sys.stdin.read().replace('\n', ',').rstrip(',')" <k.txt
1,2,3

बैश का mapfileबिल्ट-इन:

$ mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
1,2,3

rubyआदेश:

$ ruby -00 -pe 'gsub /\n/,",";chop' < k.txt
1,2,3

$ ruby -00 -pe '$_.chomp!"\n";$_.tr!"\n",","' k.txt
1,2,3

phpआदेश:

$ php -r 'echo strtr(chop(file_get_contents($argv[1])),"\n",",");' k.txt
1,2,3

चेतावनियां

ऊपर दिए गए ज्यादातर उदाहरण ठीक काम करेंगे। कुछ में छिपे हुए मुद्दे हैं, जैसे ऊपर PHP उदाहरण। फ़ंक्शन chop()वास्तव में एक उपनाम है rtrim(), इसलिए अंतिम पंक्ति के अनुगामी रिक्त स्थान को भी हटा दिया जाएगा।

तो भी पहला रूबी उदाहरण है, और पहला पायथन उदाहरण है। मुद्दा यह है कि वे सभी किस प्रकार के ऑपरेशन का उपयोग कर रहे हैं जो अनिवार्य रूप से "चॉप" करते हैं, नेत्रहीन, एक अनुगामी चरित्र। यह उदाहरण के लिए ठीक है कि ओपी ने प्रदान किया, लेकिन इस प्रकार के एक लाइनर का उपयोग करते समय ध्यान रखना चाहिए कि वे उस डेटा के अनुरूप हैं जो वे प्रसंस्करण कर रहे हैं।

उदाहरण

हमारी नमूना फ़ाइल कहें, k.txtइसके बजाय इस तरह दिखती है:

$ echo -en "1\n2\n3" > k.txt

यह समान दिखता है लेकिन इसमें एक मामूली अंतर है। यह \nमूल फ़ाइल की तरह एक अनुगामी newline ( ) नहीं है । अब जब हम पहला पायथन उदाहरण चलाते हैं तो हमें यह मिलता है:

$ python -c "import sys; print sys.stdin.read().replace('\n', ',')[0:-1]" <k.txt
1,2,

उदाहरण है कि "लगभग" काम करते हैं

ये "हमेशा एक दुल्हन, कभी दुल्हन नहीं" उदाहरण हैं। उनमें से ज्यादातर को शायद अनुकूलित किया जा सकता है, लेकिन जब किसी समस्या के संभावित समाधान पर काम करते समय, जब यह "मजबूर" लगता है, तो यह शायद नौकरी के लिए गलत उपकरण है!

perlआदेश:

$ perl -p -e 's/\n/,/' k.txt
1,2,3,

trआदेश:

$ tr '\n' ','  < k.txt 
1,2,3,

cat+ echoकमांड:

$ echo $(cat k.txt)
1 2 3

rubyआदेश:

$ ruby -pe '$_["\n"]=","' k.txt
1,2,3,

बैश का while+ readबिल्ट-इन:

$ while read line; do echo -n "$line,"; done < k.txt
1,2,3,

1
awkमैं एक छोटे विकल्प के बारे में पसंद करता हूं:awk -vORS=, 1 k.txt
मैनटवर्क

यकीन नहीं है कि क्या CentOS है bash:mapfile -t a < k.txt; (IFS=','; echo "${a[*]}")
manatwork

अनुगामी न्यूलाइन के बारे में निश्चित नहीं है। मेरे परीक्षण के अनुसार आपके perlऔर पहले awkउनके पास भी है।
मैनटवर्क

मैं pasteसबसे ऊपर रखूंगा। ठीक यही paste -sबात यहाँ के लिए है। यह एक मानक कमांड है और सबसे कुशल होगी। अन्य सभी ओवरकिल हैं और / या पोर्टेबल नहीं हैं या उनकी सीमाएँ हैं।
स्टीफन चेज़लस

mapfilebash4.0 में जोड़ा गया अपेक्षाकृत नया है ।
मैनटवर्क

4

@ एसएलएम ने पहले से ही अच्छा जवाब दिया है, लेकिन आपके सवाल के रूप में "xargs का प्रारूप आउटपुट"

xargs -I{} echo -n "{}|" < test.txt
  • -I "स्ट्रिंग बदलें" विकल्प है।
  • {} आउटपुट टेक्स्ट के लिए प्लेसहोल्डर है।
  • यह "ढूंढें" में एक घुंघराले ब्रैकेट जोड़ी के उपयोग के समान है।

यदि आप अनुगामी से छुटकारा पाना चाहते हैं तो आप कुछ साफ करने के लिए |उपयोग कर सकते हैं sed:

$ xargs -I{} echo -n "{}|" < k.txt  | sed -e 's/|$//'
1|2|3

3. 3. "1 | 2 | 3 |" के बाद एक अतिरिक्त पाइप को बांधता है। मैं थोड़ी देर लूप और awk समाधान के साथ एक ही मुद्दा रहा है।
slm

हाँ, अगर नई लाइन है .. tr, sedऔर अन्य भी ..
राहुल पाटिल

2

यह एक पुराना धागा है, मुझे पता है। ओपी ने इस तरह एक सरल कोड के साथ पूछा। इसे मूल के करीब रखने के लिए, मेरे पास एक सरल उपाय है।

cat k.txt | xargs
1 2 3

sed का उपयोग करें

cat k.txt | xargs | sed 's/ /,/g'
1,2,3

या

cat k.txt | xargs | sed 's/ /|/g'
1|2|3

सिड थोड़ा अजीब लग सकता है लेकिन टूट गया है, यह बहुत समझ में आता है।

के विकल्प के लिए है। g 'वैश्विक के लिए है: इसके बिना, यह केवल प्रत्येक नई पंक्ति पर पहला प्रतिस्थापन करेगा। चूंकि आप 'xargs' का उपयोग करते हैं, इसलिए यह उन्हें एक पंक्ति के रूप में प्रदर्शित करता है। तो आपको "1,2 3" मिलेगा।

सीमांकक का उपयोग पृथक्करण के लिए किया जाता है। मैंने / वर्ण का उपयोग किया। एक दिलचस्प चाल: आप सीमांकक को किसी भी अन्य चरित्र के साथ बदल सकते हैं, जब तक हम इसे उद्धरणों के बीच एक ही प्रारूप रखते हैं। तो यह भी काम करेगा ...।

cat k.txt | xargs | sed 's# #,#g'

या

cat k.txt | xargs | sed 'sT T,Tg'

जाहिर है, सीमांकक के रूप में कुछ वर्णों का उपयोग करने से भ्रम हो सकता है, इसलिए स्मार्ट बनें।


0
xargs <k.txt | tr \  \|

आप की आवश्यकता नहीं है cat- बस फ़ाइल इनपुट में गुजरती हैं और - अगर कोई अन्य आदेश दिया - xargsके साथ एक तरह का है जो - अपने डिफ़ॉल्ट प्रारूप बाहर पारित करेंगे /bin/echoकी (बैकस्लैश सी बच व्याख्याओं के बिना)

xargsइनपुट फ़ाइल से सिर / पूंछ व्हाट्सएप को अलग कर देगा और व्हॉट्सएप के अन्य अनुक्रमों को एक ही स्थान पर निचोड़ देगा। इसका मतलब यह है कि फ़ाइल को पास trसे xargsपसंद करते समय:

tr \\n \| <k.txt | xargs

... प्रिंट ...

1|2|3|

... जा रहा दूसरा रास्ता और पर केवल ऑपरेटिंग आर्ग कि xargsअंतरिक्ष delimits करता है ....

1|2|3\n

... क्योंकि xargsअंतिम अनुगामी newline (जैसा कि एक पाठ फ़ाइल के लिए आवश्यक है) प्रिंट करता है, लेकिन यह trउस तरह से anslated नहीं मिलता है ।

ध्यान दें, हालांकि, यह (या यहां प्रस्तुत कोई अन्य समाधान)xargs इनपुट में उद्धृत करने के लिए जिम्मेदार नहीं है । xargsइनपुट में शाब्दिक रूप से सिंगल / डबल / बैकस्लैश-कोटेड नॉन-न्यूलाइन व्हॉट्सएप चार्ट पास करेगा, जिसे स्वयं उद्धृत किया जा सकता है:

xargs <<\IN
1    2'      3'\'      \'4
IN

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