In awk würden Sie das 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`
Erläuterung
Die erste Lösung findet alle übereinstimmenden Zeilen pattern
. Wenn eine Übereinstimmung gefunden wird, wird die Datensatznummer ( NR
) im Array gespeichert nr
. Es speichert auch den 4. Datensatz NR
in demselben Array. Dies geschieht durch die nr[NR+4]
. Jeder Datensatz ( NR
) wird dann überprüft, um festzustellen, ob er im nr
Array vorhanden ist. In diesem Fall wird der Datensatz gedruckt.
Die zweite Lösung funktioniert im Wesentlichen genauso, außer wenn sie auf pattern
diese Zeile stößt und dann den vierten Datensatz davor im Array speichert und dann nr
zum nächsten Datensatz wechselt. Wenn Sie dann awk
auf diesen 4. Satz stoßen, wird der NR in nr
Block ausgeführt und gibt diesen +4 Satz danach aus.
Beispiel
Hier ist ein Beispiel für eine Datendatei sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
Verwendung der 1. Lösung:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Verwendung der 2. Lösung:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14
egrep "pattern" -A4