
Buscando el comando de la herramienta de línea de comando (awk, sed, etc.) para omitir líneas desde el principio de un archivo hasta la enésima aparición de un patrón. Dicho de otra manera, imprima solo desde la enésima aparición del patrón hasta el final del archivo. Supongamos una coincidencia por línea; La línea no necesariamente comienza con el patrón.
por ejemplo, omitir desde el principio del archivo hasta el segundo foo
en lo siguiente:
something
abc foo1
maybe something else
foo2 -this line and anything before is gone-
maybe not
foo3
something
Resultado deseado:
maybe not
foo3
something
Puntos de bonificación por incluir/excluir la línea con la enésima aparición.
Respuesta1
Aexcluirla enésima aparición del patrón
awk -v 'n=3' 'NR == 1, /pattern/ && !--n {next}; 1'
(reemplace 3
con la cantidad de ocurrencias que desee (2 en su caso) y pattern
con su patrón real ( foo
en su caso)).
Ejemplo:
$ seq 30 | awk -v 'n=3' 'NR == 1, /6/ && !--n {next}; 1'
27
28
29
30
Aincluirla enésima aparición del patrón
awk -v 'n=3' '/pattern/ && !--n, 0'
Ejemplo:
$ seq 30 | awk -v 'n=3' '/6/ && !--n, 0'
26
27
28
29
30
Respuesta2
% perl -ne 'BEGIN{$NTH=2;$p=0} print if $p; /foo/ && $NTH--; $p=1 if !$NTH' input
maybe not
foo3
something
¿Dónde NTH
está cuántas veces? Y luego necesita una bandera para imprimir; disminuir NTH
al coincidir y habilitar la impresión si NTH
se reduce lo suficiente.Muévete print
hasta el final para atrapar lo último que deseas foo
.