So lesen Sie die Datei zeilenweise und drucken die vorherige Zeile, in der die Datei ein einzelnes Token enthält

So lesen Sie die Datei zeilenweise und drucken die vorherige Zeile, in der die Datei ein einzelnes Token enthält

Meine Datei sieht beispielsweise so aus:

59 6 18 2014 169 7 14 2 7671912 7849744 201 4
60 6 19 2014 170 5 49 2 7671912 7849744 201 5
61 6 20 2014 171 6 8 2 7671912 7849744 201 6
62 6 23 2014 174 5 3 2 7671912 7849744 201 7
63 6 23 2014 174 7 17 2 7671912 7849744 201 8
64 6 24 2014 175 16 13 2 7671912 7849744 201 9
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
10
1 1 49 6 16 2014 7 39 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 2 49 6 17 2014 13 15 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 3 49 6 18 2014 1 38 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 4 49 6 18 2014 7 14 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 5 49 6 19 2014 5 49 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871

Ich muss die vorherige Zeile des einzelnen Tokeneintrags "10" drucken, die lauten sollte

65 6 25 2014 176 8 20 2 7671912 7849744 201 10

Wie kann ich das machen?

Antwort1

Sie könnenawk:

awk 'NF == 1 { print LAST } { LAST=$0 }' < datafile

Dadurch wird jede Zeile der Datei ( LAST=$0) gespeichert und wenn eine Zeile nur einen Datensatz enthält ( NF == 1- NFist grob gesagt die Anzahl der Token in der Zeile), wird die gespeicherte vorherige Zeile ausgedruckt.

Antwort2

Wenn Sie nur ein Vorkommen des Tokens haben, können Sie dies mit GNU grepund tun head:

grep -x -B 1 10 file | head -n 1

Die Option -B 1gibt an grep, die übereinstimmende Zeile und die davor auszugeben. Mit der -xOption werden grep 10Übereinstimmungen in Zeilen ausgegeben, die e xactly sind 10(im Gegensatz zuenthaltend 10). Schließlich head -n 1druckt der nur die erste der resultierenden Zeilen.

Antwort3

sed

Sie können Folgendes verwenden sed:

sed -e '/^10$/{x;p;}' -e 'x;d' < datafile

Erläuterung:

Die Adresse /^10$/stimmt mit der Zeile überein, die 10 enthält. Bei einer Übereinstimmung wird die folgende Befehlsreihe ausgeführt, die den Haltebereich mit dem Musterbereich {x;p;}austauscht ( ) und anschließend den Musterbereich druckt ().xp

Der Hold-Space enthält aufgrund des restlichen Skripts die vorherige Zeile. Tauschen Sie für jede Zeile der Datei xden Hold-Space mit dem Muster-Space aus ( ) und löschen Sie anschließend ( d) alles, was sich im Muster-Space befindet.

Im Gegensatz zum ersten Befehl, der ein Adresspräfix hat, das dafür sorgt, dass er nur dann übereinstimmt, wenn die Zeile 10 angezeigt wird, haben diese Befehle kein Präfix und stimmen daher mit jeder Zeile der Datei überein. Das Nettoergebnis ist, dass wir die letzte angezeigte Zeile immer in den Haltebereich einfügen, und die Tatsache, dass wir den Musterbereich löschen, bedeutet, dass es keine andere Ausgabe als unsere explizite Ausgabe gibt, wenn wir 10 sehen.

verwandte Informationen