Estoy tratando de imprimir la línea coincidente y la cuarta línea desde 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 tanto la línea coincidente como la cuarta línea solamente.
shell-script
debatir
fuente
fuente
egrep "pattern" -A4
grep -A 4 "pattern" file | sed -n '4p'
hace exactamente lo que quieres, a menos que te malinterprete</td>
que no es la cuarta líneaRespuestas:
En awk, lo harías de la siguiente manera
o
Explicación
La primera solución encuentra todas las líneas que coinciden
pattern
. Cuando encuentra una coincidencia, almacena el número de registro (NR
) en la matriznr
. También almacena el cuarto registro deNR
la misma matriz. Esto lo hace elnr[NR+4]
.NR
Luego se comprueba cada registro ( ) para ver si está presente en lanr
matriz, de ser así, se imprime el registro.La segunda solución funciona esencialmente de la misma manera, excepto cuando se encuentra con
pattern
que imprime esa línea, y luego almacena el cuarto registro delante de él en la matriznr
, luego pasa al siguiente registro. Luego, cuandoawk
encuentre este cuarto registro, elNR in nr
bloque se ejecutará e imprimirá este registro +4 allí después.Ejemplo
He aquí un ejemplo de archivo de datos,
sample.txt
.Usando la primera solución:
Usando la segunda solución:
fuente
awk
accesos directos aquí, ¿podría agregar una breve explicación (cosas como la impresión está implícita en awk y que las matrices son asociativas, etc.)?Simplemente estoy agregando una eliminación de las líneas apropiadas, antes de imprimir
{ 3,5d ; p }
.fuente
sed: -e expression #1, char 18: unknown option to
s'`Puede probar la
-A
opción congrep
, que especifica cuántas líneas después de la línea coincidente deben imprimirse. Combine estosed
y obtendrá las líneas requeridas.grep -A 4 pattern input.txt | sed -e '2,4d'
Usando
sed
, eliminamos el de la segunda línea hasta la cuarta.fuente
pattern
en el archivo.Aquí hay una manera en Perl que puede manejar un número arbitrario de líneas coincidentes:
En perl. La variable especial
$.
es el número de línea actual. Entonces, cada vez que encuentro una coincidencia de líneapattern
, la imprimo y guardo su número de línea como$c
. Luego imprimo nuevamente cuando el número de línea actual es 4 más que el impreso anteriormente.fuente
Básicamente estás haciendo una búsqueda y reemplazo. Puede agregar solo un hallazgo en el mismo comando y los imprimirá a ambos :)
fuente