En awk, vous le feriez comme suit
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
ou
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
Explication
La première solution trouve toutes les lignes qui correspondent pattern
. Lorsqu'il trouve une correspondance, il stocke le numéro d'enregistrement ( NR
) dans le tableau nr
. Il stocke également le 4ème enregistrement NR
dans le même tableau. Cela se fait par le nr[NR+4]
. Chaque enregistrement ( NR
) est ensuite vérifié pour voir s'il est présent dans le nr
tableau, si c'est le cas, l'enregistrement est imprimé.
La deuxième solution fonctionne essentiellement de la même manière, sauf lorsqu'elle rencontre la pattern
ligne imprimée, puis stocke le 4e enregistrement devant lui dans le tableau nr
, puis passe à l'enregistrement suivant. Ensuite, lorsque vous awk
rencontrez ce 4ème enregistrement, le NR in nr
bloc sera exécuté et imprimera cet enregistrement +4 par la suite.
Exemple
Voici un exemple de fichier de données, sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
En utilisant la 1ère solution:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Utilisation de la 2ème solution:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14
egrep "pattern" -A4