W awk zrobiłbyś to w następujący sposób
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
lub
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
Wyjaśnienie
Pierwsze rozwiązanie wyszukuje wszystkie pasujące linie pattern
. Po znalezieniu dopasowania zapisuje numer rekordu ( NR
) w tablicy nr
. Przechowuje również 4. rekord z NR
tej samej tablicy. Odbywa się to przez nr[NR+4]
. Każdy rekord ( NR
) jest następnie sprawdzany, aby sprawdzić, czy jest obecny w nr
tablicy, a jeśli tak, to rekord jest drukowany.
Drugie rozwiązanie działa zasadniczo w ten sam sposób, z wyjątkiem sytuacji, gdy napotka pattern
drukowaną linię, a następnie zapisze 4. rekord przed nią w tablicy nr
, a następnie przejdzie do następnego rekordu. Następnie, gdy awk
napotka ten czwarty rekord, NR in nr
blok zostanie wykonany i wydrukuje ten rekord +4 po nim.
Przykład
Poniżej znajduje się plik danych przykładem sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
Korzystanie z pierwszego rozwiązania:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Korzystanie z drugiego rozwiązania:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14
egrep "pattern" -A4