usando o awk para imprimir linhas de uma partida até uma segunda instância de uma partida separada

4

Eu tenho um requisito. Digamos que o conteúdo do meu arquivo seja

a
b
c
d
e
f
d
e
f

Eu quero imprimir as linhas de b para a segunda vez repetida d . Existe algum comando usando o awk para fazer isso?

O resultado deve ser

b
c
d
e
f
d

Se for a primeira vez b , eu sei o comando

awk '/b/,/d/' file.txt

Mas quero imprimir o texto no ponto correspondente se ele repetir a segunda vez. Eu quero ter o comando em uma linha.

    
por ravi repaka 13.11.2017 / 07:18

2 respostas

7

Uma maneira é usar sinalizadores e marcadores para acompanhar

$ awk '/b/{f=1; c=0} f; /d/ && ++c==2{f=0}' file.txt
b
c
d
e
f
d
  • /b/{f=1; c=0} definir sinalizador para partida inicial e inicializar contador
  • f; imprime o registro de entrada quando o marcador longo é definido
  • /d/ && ++c==2{f=0} limpar o sinalizador se a string final for correspondida pela segunda vez
  • pode simplificar para awk '/b/{f=1} f; /d/ && ++c==2{exit}' se houver apenas um conjunto a ser extraído


Note que se a partida final não tiver 2 correspondências, ela será impressa até o final da entrada

$ seq 10 | awk '/4/{f=1; c=0} f; /6/ && ++c==2{f=0}'
4
5
6
7
8
9
10
    
por 13.11.2017 / 07:27
1
  1. Um código mais legível. Acompanhe as contagens de caracteres.
  2. Imprimir contando b = 1 e d < = 2.
  3. Parar uma vez a contagem de d atingiu 2.

    awk '{ a[$1]++;
        if(a["b"]==1 && a["d"]<=2){
            print;
        }
        if(a["d"]==2){
           a["d"]=10
        }
    }' file.txt
    
por 13.11.2017 / 12:03