J'essaie d'imprimer la ligne correspondante et la 4ème ligne à partir de la ligne correspondante (ligne contenant l'expression que je recherche).
J'utilise le code suivant :sed -n 's/^[ t]*//; /img class="devil_icon/,4p' input.txt
Mais cela n'imprime que la ligne correspondante.
Cela n'imprime que la 4ème ligne.awk 'c&&!--c;/img class="devil_icon/{c=4}' input.txt
Je dois imprimer à la fois la ligne correspondante et la 4ème ligne uniquement.
Réponse acceptée :
Dans 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 de NR
dans le même tableau. Ceci est 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 le pattern
il imprime cette ligne, puis stocke le 4ème enregistrement devant lui dans le tableau nr
, puis passe à l'enregistrement suivant. Puis quand awk
rencontre ce 4ème enregistrement le NR in nr
bloc sera exécuté et imprimera ensuite cet enregistrement +4.
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
En utilisant la 2ème solution :
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14