Frage bash / sed / awk / etc entfernt alle anderen Zeilenumbrüche


Ein Bash-Befehl gibt folgendes aus:

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

Ich würde es gerne an etwas weiterleiten, damit es so aussieht:

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
[...]

d. h., alle anderen Zeilenumbrüche werden entfernt

Ich habe es versucht ... |tr "\nGroup" " " aber es hat alle Zeilenumbrüche entfernt und auch einige andere Buchstaben aufgefressen. Vielen Dank


37
2018-03-29 23:53


Ursprung


tr ist vollständig zeichenbasiert: Sie haben tr aufgefordert, Zeilenumbrüche und alle 'G', 'r', 'o', 'u' und 'p' zu entfernen. - glenn jackman
Aha, ich dachte, es wäre eine Regex, danke - carillonator


Antworten:


kann jetzt nicht testen, aber

... | paste - - 

Sollte es tun


67
2018-03-30 01:00



+1 - funktioniert und ist elegant. (Es legt einen Tab zwischen den Zeilen - paste -d ' ' - - wird stattdessen ein Leerzeichen hinzufügen, falls erforderlich) - cyberx86
Könnten Sie bitte erklären, wie der Befehl funktioniert? Warum gibt es zwei? -? Vielen Dank - bbaja42
paste wird verwendet, um entsprechende Zeilen aus Dateien zu verketten: paste file1 file2 file3 .... Wenn eines der Argumente "Datei" "-" ist, werden Zeilen von der Standardeingabe gelesen. Wenn es 2 "-" Argumente gibt, nimmt Paste 2 Zeilen von stdin. Und so weiter. Sehen die Manpage. - glenn jackman


Eine Möglichkeit ist:

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

Wenn die Zeilennummer durch 2 teilbar ist, endet sie mit einer neuen Zeile, andernfalls endet sie mit einem Leerzeichen.

(Getestet auf: CentOS 6, GNU Awk 3.1.7)

Mit sed (siehe Erläuterung):

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

Weiterführende Literatur:


10
2018-03-30 00:17





Wenn Sie verwenden möchten sedEs gibt keinen Grund, die ganze Datei in den Speicher zu schreiben. Sie können jede andere Zeile wie folgt zusammenführen:

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

Verwenden Sie ein beliebiges Zeichen anstelle des Platzes.

Hier ist ein anderer Weg mit awk:

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

Das if/else behandelt den Fall, in dem sich eine ungerade Anzahl von Zeilen in der Datei befindet. Ohne es wird die ungerade letzte Zeile zweimal gedruckt. Andernfalls könnten Sie zum Vergleich Folgendes tun:

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

8
2018-03-30 06:20



Ein später Kommentar: 1) benutze immer einen Formatbezeichner für printf, wenn die Zeichenfolge Prozentzeichen hat, 2) um die doppelte letzte Zeile zu vermeiden, setze $ 0 auf "" - awk '{printf "%s", $0; $0=""; getline; print " " $0}' - glenn jackman


Die idiomatische Art, es zu tun awk ist wie folgt:

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

Es gibt aus:

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

Um es zu erklären, müssen wir jede der eingebauten Variablen definieren:

  • RS Trennzeichen aufzeichnen. Standardeinstellungen für \n (Neue Zeile).
  • ORS Ausgabesatztrennzeichen Standardeinstellungen für \n (Neue Zeile).
  • FS Feldtrennzeichen. Standardeinstellungen für  (Platz).
  • NR Nummer des Datensatzes.

Da das Standard-Datensatztrennzeichen die neue Zeile ist, ist ein Datensatz standardmäßig eine Zeile.

NR%2 ist der Modulus von NR/2, so dass es entweder sein wird 0 oder 1. 0 für gerade Linien und 1 für ungerade Zeilen.

var=condition?condition_if_true:condition_if_false ist der ternäre Operator.

Alles zusammen sagen ORS=NR%2?FS:RS Wir definieren das Ausgabesatztrennzeichen:

  • wenn die Nummer des Datensatzes im Formular ist 2k + 1das heißt, auf geraden Zeilen, dann wird das Ausgabe-Record-Trennzeichen auf gesetzt FSdas ist ein Raum.
  • wenn die Nummer des Datensatzes im Formular ist 2kdas heißt, auf ungeraden Zeilen, dann wird das Ausgabe-Record-Trennzeichen gesetzt RSDas ist eine neue Zeile.

Auf diese Weise enden ungerade Zeilen mit einem Leerzeichen, das dann mit der nächsten Zeile verbunden wird. Nach dieser Zeile wird eine neue Zeile gedruckt.

Mehr Infos in Idiomatische awk.


3
2017-10-08 09:31





Das funktioniert bei mir unter Linux:

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

Dies ersetzt einen leeren Platz für ein Zeilenumbruchzeichen. Sie Muss entkomme dem Newline-Zeichen, damit die Dinge richtig funktionieren.


2
2018-03-30 14:49



Dies entfernt alle Zeilenumbrüche, nicht alle andere Neue Zeile. - Trenton


In bash:

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

2
2018-04-05 12:14





Wenn Perl eine Option ist:

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

s/\n/ / ersetzt Zeilenschaltung durch Leerzeichen
$. ist die Zeilennummer


1
2017-11-10 20:31





Wie wäre es mit der Verwendung? grep ?

.. | grep -v '^Group State'

-1
2018-03-30 06:28



Das eliminiert die abwechselnden Zeilen. Das OP möchte, dass sie angehängt werden. - Dennis Williamson
Ja, nachdem ich die Frage nochmal gelesen habe, habe ich das gerade gemerkt :) - pkhamre