Ich frage mich, wie Awk verwenden, um alle 2 Zeilen von Daten statt jeder einzelnen zu verarbeiten. Standardmäßig wird das Record-Trennzeichen (RS) auf jede neue Zeile gesetzt, wie kann ich dies auf alle 2 Zeilen ändern.awk zum Ändern der Datensatztrennzeichen (RS) auf alle 2 Zeilen
Antwort
Dividieren & Conquer: tut es in zwei Schritten:
- Verwendung awk jedes Zweilinienaufzeichnungsleerzeile
zu trennen einzuführen: zu einem anderen awk ProzessNR%2==0 {print ""}
- Rohr und Platten
set Trennzeichen zur Leerzeile:BEGIN {RS=""}
Vorteil: In der zweiten awk
Prozess Sie haben alle Felder der beiden Zeilen als $1 to $NF
zugänglich.
awk '{print}; NR%2==0 {print ""}' data | \
awk 'BEGIN {RS=""}; {$1=$1;print}'
Hinweis:
$1=$1
hier verwendet wird, ein Update auf $0
(die gesamten Datensatz) zu erzwingen.
Dies garantiert, dass der Ausdruck den zweizeiligen Datensatz in einer Zeile ausgibt.
Sobald Sie ein Feld in Ihrem Programm ändern, wenn Sie die zweizeiligen Datensätze verarbeiten, ist dies nicht mehr erforderlich.
Es hängt davon ab, was Sie erreichen möchten, aber eine Möglichkeit besteht darin, die getline
Anweisung zu verwenden. Lesen Sie für jede Zeile das nächste und speichern Sie es in einer Variablen. So werden Sie erste Zeile haben in $0
und zweite in even_line
:
getline even_line
Wenn Sie Linien zusammenführen möchten, verwenden Sie das paste
Dienstprogramm:
$ printf "%s\n" one two three four five
one
two
three
four
five
$ printf "%s\n" one two three four five | paste -d " " - -
one two
three four
five
Dieses etwas hackish ist, aber es ist eine wörtliche Antwort auf Ihre Frage:
awk 'BEGIN {RS = "[^\n]*\n[^\n]*\n"} {$0 = RT; print $1, $NF}' inputfile
Setzen Sie das Datensatztrennzeichen auf eine Regex, die zwei Zeilen entspricht. Setzen Sie dann für jede Zeile $0
auf den Record-Terminator (was der Regex in RS
entspricht). Dies führt eine Feldaufteilung unter FS
durch. Die Print-Anweisung ist nur ein Demonstrations-Platzhalter.
Beachten Sie, dass $0
zwei Zeilenumbrüche enthält, die Felder jedoch keine Zeilenumbrüche enthalten.