2012-08-11 10 views

Antwort

4

Dividieren & Conquer: tut es in zwei Schritten:

  1. Verwendung awk jedes Zweilinienaufzeichnungsleerzeile
    zu trennen einzuführen: zu einem anderen awk Prozess NR%2==0 {print ""}
  2. 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.

6

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 
4

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 
3

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.

Verwandte Themen