delete do início do arquivo para a nth ocorrência do padrão

1

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

por exemplo. omitir do começo do arquivo ao segundo foo no 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 para incluir / excluir a linha com a enésima ocorrência.

    
por JB0x2D1 04.11.2016 / 14:52

2 respostas

3

Para excluir a ocorrência th do padrão

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

(substitua 3 pelo número de ocorrências desejadas (2 no seu caso) e pattern com o padrão atual ( foo no seu caso)).

Exemplo:

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

Para incluir a ocorrência th 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
    
por 04.11.2016 / 15:14
0
% perl -ne 'BEGIN{$NTH=2;$p=0} print if $p; /foo/ && $NTH--; $p=1 if !$NTH' input
maybe not
foo3
something

Onde NTH é quantas vezes e, em seguida, você precisa de um sinalizador para imprimir; decrementar NTH na correspondência e ativar a impressão se NTH tiver diminuído o suficiente. Mova print para o final para pegar o% desejado desejado.foo.

    
por 04.11.2016 / 14:58