
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
- NF
ist 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 grep
und tun head
:
grep -x -B 1 10 file | head -n 1
Die Option -B 1
gibt an grep
, die übereinstimmende Zeile und die davor auszugeben. Mit der -x
Option werden grep 10
Übereinstimmungen in Zeilen ausgegeben, die e x
actly sind 10
(im Gegensatz zuenthaltend 10
). Schließlich head -n 1
druckt 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 ().x
p
Der Hold-Space enthält aufgrund des restlichen Skripts die vorherige Zeile. Tauschen Sie für jede Zeile der Datei x
den 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.