Estoy tratando de imprimir la línea coincidente y la cuarta línea de la línea coincidente (línea que contiene la expresión que estoy buscando).
He estado usando el siguiente código:sed -n 's/^[ t]*//; /img class="devil_icon/,4p' input.txt
Pero esto solo imprime la línea coincidente.
Esto imprime solo la cuarta línea.awk 'c&&!--c;/img class="devil_icon/{c=4}' input.txt
Necesito imprimir solo la línea coincidente y la cuarta línea.
Respuesta aceptada:
En awk, lo harías de la siguiente manera
awk '/pattern/{nr[NR]; nr[NR+4]}; NR in nr' file > new_file`
o
awk '/pattern/{print; nr[NR+4]; next}; NR in nr' file > new_file`
Explicación
La primera solución encuentra todas las líneas que coinciden con pattern
. Cuando encuentra una coincidencia, almacena el número de registro (NR
) en la matriz nr
. También almacena el cuarto registro de NR
en la misma matriz. Esto lo hace el nr[NR+4]
. Cada registro (NR
) luego se verifica para ver si está presente en el nr
matriz, si es así, se imprime el registro.
La segunda solución funciona esencialmente de la misma manera, excepto cuando encuentra el pattern
imprime esa línea y luego almacena el cuarto registro delante de él en la matriz nr
, luego va al siguiente registro. Luego, cuando awk
encuentra este cuarto registro el NR in nr
el bloque se ejecutará e imprimirá este registro +4 allí después.
Ejemplo
Aquí hay un archivo de datos de ejemplo, sample.txt
.
$ cat sample.txt
1
2
3
4 blah
5
6
7
8
9
10 blah
11
12
13
14
15
16
Usando la primera solución:
$ awk '/blah/{nr[NR]; nr[NR+4]}; NR in nr' sample.txt
4 blah
8
10 blah
14
Usando la segunda solución:
$ awk '/blah/{print; nr[NR+4]; next}; NR in nr' sample.txt
4 blah
8
10 blah
14