excluir do início do arquivo até a enésima ocorrência do padrão

excluir do início do arquivo até a enésima ocorrência do padrão

Procurando o comando da ferramenta de linha de comando (awk, sed, etc.) para omitir linhas desde o início de um arquivo até a enésima ocorrência de um padrão. Dito de outra forma, imprima apenas da enésima ocorrência do padrão até o final do arquivo. Suponha uma correspondência por linha; a linha não começa necessariamente com o padrão.

por exemplo, omita do início do arquivo ao segundo foono seguinte:

something
abc foo1
maybe something else
foo2 -this line and anything before is gone- 
maybe not
foo3
something

Resultado desejado:

maybe not
foo3
something

Pontos de bônus por incluir/excluir a linha com a enésima ocorrência.

Responder1

Paraexcluira enésima ocorrência do padrão

awk -v 'n=3' 'NR == 1, /pattern/ && !--n {next}; 1'

(substitua 3pelo número de ocorrências desejadas (2 no seu caso) e patternpelo seu padrão real ( foono seu caso)).

Exemplo:

$ seq 30 | awk -v 'n=3' 'NR == 1, /6/ && !--n {next}; 1'
27
28
29
30

Paraincluira enésima ocorrência do padrão

awk -v 'n=3' '/pattern/ && !--n, 0'

Exemplo:

$ seq 30 | awk -v 'n=3' '/6/ && !--n, 0'
26
27
28
29
30

Responder2

% perl -ne 'BEGIN{$NTH=2;$p=0} print if $p; /foo/ && $NTH--; $p=1 if !$NTH' input
maybe not
foo3
something

Onde NTHestá quantas vezes, e então você precisa de uma bandeira para imprimir; diminuir NTHna correspondência e ativar a impressão se NTHfor diminuído o suficiente.Mova-se printpara o final para capturar o final desejado foo.

informação relacionada