В awk вы бы сделали это следующим образом
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
или
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
объяснение
Первое решение находит все совпадающие строки pattern
. Когда он находит совпадение, он сохраняет номер записи ( NR
) в массиве nr
. Он также хранит 4-ую запись NR
в том же массиве. Это сделано nr[NR+4]
. Каждая запись ( NR
) затем проверяется, чтобы увидеть, присутствует ли она в nr
массиве, если это так, запись распечатывается.
Второе решение работает, по сути, таким же образом, за исключением того, что когда оно встречает, pattern
печатает эту строку, а затем сохраняет четвертую запись перед ней в массиве nr
, а затем переходит к следующей записи. Затем, когда awk
встретится с этой 4-й записью, NR in nr
блок будет выполнен и напечатает эту запись +4 после этого.
пример
Вот пример файла данных sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
Используя 1-е решение:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Используя 2-е решение:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14
egrep "pattern" -A4