Ich versuche, die übereinstimmende Zeile und die vierte Zeile der übereinstimmenden Zeile (Zeile mit dem gesuchten Ausdruck) zu drucken.
Ich habe den folgenden Code verwendet:sed -n 's/^[ t]*//; /img class="devil_icon/,4p' input.txt
Aber das gibt nur die übereinstimmende Zeile aus.
Dies gibt nur die vierte Zeile aus.awk 'c&&!--c;/img class="devil_icon/{c=4}' input.txt
Ich muss sowohl die übereinstimmende Zeile als auch nur die vierte Zeile drucken.
Akzeptierte Antwort:
In awk würdest du es wie folgt machen
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
oder
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
Erklärung
Die erste Lösung findet alle Zeilen, die mit pattern
übereinstimmen . Wenn es eine Übereinstimmung findet, speichert es die Datensatznummer (NR
) im Array nr
. Es speichert auch den 4. Datensatz von NR
im selben Array. Dies geschieht durch den nr[NR+4]
. Jeder Datensatz (NR
) wird dann überprüft, ob es in nr
vorhanden ist Array, wenn ja, wird der Datensatz gedruckt.
Die zweite Lösung funktioniert im Wesentlichen genauso, außer wenn sie auf das pattern
stößt es druckt diese Zeile und speichert dann den 4. Datensatz davor im Array nr
, geht dann zum nächsten Datensatz. Dann wenn awk
trifft auf diesen 4. Datensatz auf NR in nr
Block wird ausgeführt und gibt danach diesen +4-Eintrag aus.
Beispiel
Hier ist eine Beispieldatendatei, sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
Verwenden der 1. Lösung:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Verwenden der 2. Lösung:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14