सवाल बैश / sed / awk / आदि हर दूसरी नई लाइन को हटा दें


एक बैश आदेश यह आउटपुट करता है:

Runtime Name: vmhba2:C0:T3:L14
Group State: active
Runtime Name: vmhba3:C0:T0:L14
Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14
Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14
Group State: active
Runtime Name: vmhba2:C0:T2:L14
Group State: active

मैं इसे इस तरह दिखने के लिए इसे किसी चीज़ पर पाइप करना चाहता हूं:

Runtime Name: vmhba2:C0:T1:L14 Group State: active 
Runtime Name: vmhba3:C0:T3:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T2:L14 Group State: active
[...]

यानी हर दूसरी नई लाइन को हटा दें

मैंने कोशिश की ... |tr "\nGroup" " " लेकिन यह सभी न्यूलाइन हटा दिया और कुछ अन्य पत्र भी खा लिया। धन्यवाद


37
2018-03-29 23:53


मूल


tr पूरी तरह से चरित्र आधारित है: आपने नई लाइनों और सभी 'जी', 'आर', 'ओ', 'यू', और 'पी' को हटाने के लिए टी से पूछा। - glenn jackman
आह, मैंने सोचा कि यह एक रेगेक्स था, धन्यवाद - carillonator


जवाब:


अभी परीक्षण नहीं कर सकते, लेकिन

... | paste - - 

यह करना चाहिए


67
2018-03-30 01:00



+1 - काम करता है और सुरुचिपूर्ण है। (यह लाइनों के बीच एक टैब रखता है - paste -d ' ' - - यदि आवश्यक हो तो इसके बजाय एक जगह जोड़ देगा) - cyberx86
क्या आप कृपया बता सकते हैं कि आदेश कैसे काम करता है? दो क्यों हैं -? धन्यवाद - bbaja42
paste फ़ाइलों से संबंधित लाइनों को संयोजित करने के लिए प्रयोग किया जाता है: paste file1 file2 file3 ...। यदि "फ़ाइल" तर्कों में से एक "-" है, तो मानक मानक से रेखाएं पढ़ी जाती हैं। यदि 2 "-" तर्क हैं, तो पेस्ट stdin से 2 लाइनें लेता है। और इसी तरह। देख मैन पेज। - glenn jackman


एक संभावना है:

awk 'ORS=NR%2?" ":"\n"'

यदि रेखा संख्या समान रूप से 2 से विभाजित है, तो एक नई लाइन के साथ समाप्त होती है, अन्यथा, एक स्थान के साथ समाप्त होता है।

(पर परीक्षण: CentOS 6, जीएनयू Awk 3.1.7)

Sed का उपयोग (देखें व्याख्या):

sed ':a;N;$!ba;s/\nGroup/ Group/g'

आगे की पढाई:


10
2018-03-30 00:17





यदि आप उपयोग करना चाहते हैं sed, पूरी फ़ाइल को स्मृति में पढ़ने का कोई कारण नहीं है। आप इस तरह की हर दूसरी लाइन मर्ज कर सकते हैं:

sed 'N;s/\n/ /' inputfile

अंतरिक्ष के बजाए इच्छित किसी भी चरित्र का प्रयोग करें।

Awk का उपयोग कर एक और तरीका यहाँ है:

awk '{printf "%s", $0; if (getline) print " " $0; else printf "\n"}' inputfile

if/else उस मामले को संभालता है जहां फ़ाइल में लाइनों की एक विषम संख्या है। इसके बिना, अजीब आखिरी पंक्ति दो बार मुद्रित हो जाती है। अन्यथा, तुलना के लिए, आप कर सकते हैं:

awk '{printf "%s", $0; getline; print " " $0}'

8
2018-03-30 06:20



देर से टिप्पणी: 1) स्ट्रिंग के प्रतिशत संकेतों के मामले में प्रिंटफ के लिए हमेशा एक प्रारूप विनिर्देशक का उपयोग करें, 2) डुप्लिकेटेड अंतिम पंक्ति से बचने के लिए, $ 0 को "" सेट करें - awk '{printf "%s", $0; $0=""; getline; print " " $0}' - glenn jackman


इसे करने का सबसे बेवकूफ तरीका awk इस प्रकार है:

awk 'ORS=NR%2?FS:RS' file

यह आउटपुट करता है:

Runtime Name: vmhba2:C0:T3:L14 Group State: active
Runtime Name: vmhba3:C0:T0:L14 Group State: active unoptimized
Runtime Name: vmhba2:C0:T1:L14 Group State: active unoptimized
Runtime Name: vmhba3:C0:T3:L14 Group State: active
Runtime Name: vmhba2:C0:T2:L14 Group State: active

इसे समझाने के लिए हमें अंतर्निहित चर के प्रत्येक को परिभाषित करने की आवश्यकता है:

  • RS रिकॉर्ड विभाजक। के लिए डिफ़ॉल्ट \n (नई पंक्ति)।
  • ORS आउटपुट रिकॉर्ड विभाजक। के लिए डिफ़ॉल्ट \n (नई पंक्ति)।
  • FS क्षेत्र विभाजक। के लिए डिफ़ॉल्ट  (स्थान)।
  • NR रिकॉर्ड की संख्या।

चूंकि डिफ़ॉल्ट रिकॉर्ड विभाजक नई लाइन है, एक रिकॉर्ड डिफ़ॉल्ट रूप से एक रेखा है।

NR%2 का मॉड्यूलस है NR/2, ताकि यह या तो होगा 0 या 10 लाइनों के लिए भी 1 विषम रेखाओं के लिए।

var=condition?condition_if_true:condition_if_false टर्नरी ऑपरेटर है।

सब एक साथ, कह रहे हैं ORS=NR%2?FS:RS हम आउटपुट रिकॉर्ड विभाजक परिभाषित कर रहे हैं:

  • अगर रिकॉर्ड की संख्या फॉर्म पर है 2k + 1, यानी, लाइनों पर भी, आउटपुट रिकॉर्ड विभाजक सेट है FS, वह एक जगह है।
  • अगर रिकॉर्ड की संख्या फॉर्म पर है 2k, जो कि विषम रेखाओं पर है, तो आउटपुट रिकॉर्ड विभाजक सेट है RS, वह एक नई लाइन है।

इस तरह, विषम रेखाएं एक अंतरिक्ष के साथ समाप्त होती हैं, जो तब अगली पंक्ति के साथ जुड़ जाती हैं। उस पंक्ति के बाद, एक नई लाइन मुद्रित की जाती है।

में अधिक जानकारी बेवकूफ अजीब


3
2017-10-08 09:31





यह लिनक्स पर मेरे लिए काम करता है:

... | tr "\\n" " "

यह एक न्यूलाइन चरित्र के लिए एक खाली स्थान की जगह लेता है; आप जरूर चीजों को सही ढंग से काम करने के लिए न्यूलाइन चरित्र से बचें।


2
2018-03-30 14:49



यह प्रत्येक नई लाइन को हटा देता है, हर नहीं अन्य नई पंक्ति। - Trenton


बाश में:

... | while read l1; do read l2; echo "$l1 $l2"; done

2
2018-04-05 12:14





यदि पर्ल एक विकल्प है:

perl -pe 's/\n/ / if $. % 2 == 1' file

s/\n/ / अंतरिक्ष के साथ नई लाइन बदलता है
$. रेखा संख्या है


1
2017-11-10 20:31





उपयोग करने के बारे में कैसे grep ?

.. | grep -v '^Group State'

-1
2018-03-30 06:28



यह वैकल्पिक लाइनों को समाप्त करता है। ओपी चाहता है कि वे संलग्न हों। - Dennis Williamson
हाँ, प्रश्न को फिर से पढ़ने के बाद मुझे बस एहसास हुआ कि :) - pkhamre