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 möchte es 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
[...]
dh alle anderen Zeilenumbrüche entfernen
Ich habe es versucht, ... |tr "\nGroup" " "
aber es hat alle Zeilenumbrüche entfernt und auch einige andere Buchstaben aufgefressen. Vielen Dank
tr
ist vollständig zeichenbasiert: Sie haben tr gebeten, Zeilenumbrüche und alle Zeichen 'G', 'r', 'o', 'u' und 'p' zu entfernen.Antworten:
kann momentan nicht testen, aber
Sollte es tun
quelle
paste -d ' ' - -
-
? Dankepaste
entsprechende Zeilen von Dateien verketten verwendet wird :paste file1 file2 file3 ...
. Wenn eines der "file" -Argumente "-" ist, werden Zeilen aus der Standardeingabe gelesen. Wenn es 2 "-" Argumente gibt, nimmt das Einfügen 2 Zeilen von stdin. Und so weiter. Siehe die Manpage .Eine Möglichkeit ist:
Wenn die Zeilennummer gleichmäßig durch 2 teilbar ist, schließen Sie mit einer neuen Zeile ab, andernfalls mit einem Leerzeichen.
(Getestet unter: CentOS 6, GNU Awk 3.1.7)
Verwendung von sed (siehe Erklärung ):
Weitere Lektüre:
quelle
Wenn Sie verwenden möchten
sed
, gibt es keinen Grund, die gesamte Datei in den Speicher zu lesen. Sie können jede andere Zeile wie folgt zusammenführen:Verwenden Sie anstelle des Leerzeichens ein beliebiges Zeichen.
Hier ist eine andere Möglichkeit, awk zu benutzen:
Das
if/else
behandelt den Fall, in dem sich eine ungerade Anzahl von Zeilen in der Datei befindet. Ohne wird die ungerade letzte Zeile zweimal gedruckt. Andernfalls könnten Sie zum Vergleich Folgendes tun:quelle
awk '{printf "%s", $0; $0=""; getline; print " " $0}'
Der idiomatischste Weg, dies zu tun,
awk
ist wie folgt:Es gibt aus:
Um dies zu erklären, müssen wir jede der eingebauten Variablen definieren:
RS
Datensatztrennzeichen. Standardmäßig\n
(neue Zeile).ORS
Ausgabesatztrennzeichen. Standardmäßig\n
(neue Zeile).FS
Feldtrennzeichen. Standardmäßig(Leerzeichen).
NR
Nummer des Datensatzes.Da das Standard-Datensatztrennzeichen die neue Zeile ist, ist ein Datensatz standardmäßig eine Zeile.
NR%2
ist der Modul vonNR/2
, so dass es entweder0
oder sein wird1
.0
für gerade und1
für ungerade Zeilen.var=condition?condition_if_true:condition_if_false
ist der ternäre Operator.Alles
ORS=NR%2?FS:RS
in allem definieren wir das Trennzeichen für die Ausgabedatensätze:2k + 1
befindet, dh in geraden Zeilen, werden die Trennzeichen für die Ausgabedatensätze aufFS
ein Leerzeichen gesetzt.2k
befindet, dh in ungeraden Zeilen, werden die Trennzeichen für die Ausgabedatensätze aufRS
eine neue Zeile gesetzt.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.
Weitere Infos in Idiomatic awk .
quelle
Das funktioniert bei mir unter Linux:
Dies ersetzt ein Leerzeichen für ein Zeilenumbruchzeichen. Sie müssen das Zeilenumbruch-Zeichen umgehen, damit die Dinge richtig funktionieren.
quelle
In der Bash:
quelle
Wenn Perl eine Option ist:
perl -pe 's/\n/ / if $. % 2 == 1' file
s/\n/ /
Ersetzt Newline durch Leerzeichen,$.
ist dies die Zeilennummerquelle
Wie wäre es mit
grep
?quelle