bash / sed / awk / etc हर दूसरे न्यूलाइन को हटा दें


39

एक bash कमांड यह आउटपुट देता है:

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" " "लेकिन इसने सभी नई खबरों को हटा दिया और कुछ अन्य पत्रों को भी खा लिया। धन्यवाद


2
trपूरी तरह से चरित्र आधारित है: आपने ट्राय से न्यूलाइन्स और सभी 'जी', 'आर', 'ओ', 'यू' और 'पी' को हटाने के लिए कहा।
ग्लेन जैकमैन

जवाबों:


80

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

... | paste - - 

करना चाहिए


5
+1 - काम करता है और सुरुचिपूर्ण है। (यह लाइनों के बीच एक टैब डालता है - paste -d ' ' - -यदि आवश्यक हो तो इसके बजाय एक स्थान जोड़ देगा)
साइबरबरी

4
क्या आप बता सकते हैं कि कमांड कैसे काम करता है? दो क्यों हैं -? धन्यवाद
bbaja42

7
pasteफ़ाइलों से संबंधित लाइनों को समाप्‍त करने के लिए उपयोग किया जाता है paste file1 file2 file3 ...:। यदि "फ़ाइल" तर्कों में से एक "-" है, तो मानक इनपुट से लाइनें पढ़ी जाती हैं। यदि 2 "-" तर्क हैं, तो पेस्ट स्टड से 2 लाइनें लेता है। और इसी तरह। मैन पेज देखें ।
ग्लेन जैकमैन

10

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

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

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

(परीक्षण किया गया: CentOS 6, GNU Awk 3.1.7)

Sed का उपयोग करना ( स्पष्टीकरण देखें ):

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

आगे की पढाई:


8

यदि आप उपयोग करना चाहते हैं 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}'

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

3

इसे करने का सबसे मुहावरेदार तरीका 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या 1। सम रेखाओं के लिए 0और 1विषम रेखाओं के लिए।

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

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

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

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

Idiomatic awk में अधिक जानकारी ।


2

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

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

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


यह हर नईलाइन को हटाता है, हर दूसरी न्यूलाइन को नहीं।
ट्रेंटन


1

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

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

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


-1

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

.. | grep -v '^Group State'

यह वैकल्पिक लाइनों को समाप्त करता है। ओपी चाहता है कि उन्हें जोड़ा जाए।
अगली सूचना तक रोक दिया गया।

हाँ, प्रश्न को फिर से पढ़ने के बाद मुझे एहसास हुआ कि :)
pkhamre
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.