Obter linhas até o primeiro intervalo de padrões correspondente [duplicado]

0

Eu tenho um arquivo que se parece com o seguinte:

line1
line2
line3
line4
line5
line6
line7
line5
line2

Eu quero obter dados entre line1 e line5 . Eu usei awk '/line1/,/line5/' myfile . Esperando que a saída seja:

line1
line2
line3
line4
line5

Mas o awk lê até a última correspondência line5 . Eu desejo que o awk pare no primeiro jogo e não no último jogo.

    
por kalpesh 24.01.2018 / 16:04

3 respostas

2

Você pode usar abaixo de awk :

awk '/line1/{prnt=1} prnt{print} /line5/{exit}' infile

Isso imprimirá as linhas correspondidas com line1 até a próxima primeira linha correspondida com line5 e sairá imediatamente.

    
por 26.01.2018 / 11:08
2

Não consigo reproduzir seu problema. O awk * faz o que eu esperaria: imprimir cada linha entre a primeira ocorrência de line1 até a primeira ocorrência de line5 :

$ awk '/line1/,/line5/' file
line1
line2
line3
line4
line5

É possível que você tenha um caractere de não-impressão oculto em algum lugar dentro da string line5 na quinta linha do seu arquivo? Isso explicaria por que awk não corresponde a ele.

Você pode verificar novamente executando o sed equivalente:

$ sed -n '/line1/,/line5/p' file
line1
line2
line3
line4
line5

O -n instrui sed a não imprimir todas as linhas (seu comportamento padrão) enquanto /line1/,/line5/p instrui a impressão de cada linha da primeira correspondência de line1 até a primeira correspondência de line5 .

Se quiser imprimir somente o conjunto de linhas primeiro começando com uma linha que corresponda ao padrão line1 e terminando com uma linha que corresponda a line5 , você poderá usar:

sed -n '/line1/,$p;/line5/q' file

* Eu verifiquei usando gawk , a implementação GNU de awk (e Kusalananda confirmou que awk e mawk no OpenBSD também fazem a coisa certa).

    
por 26.01.2018 / 11:09
0
awk '/foo/,/bar/'

imprime todas as seções do arquivo que começam com uma linha correspondente a foo e terminam com a próxima linha depois disso (ou até mesmo a mesma linha contrária ao sed equivalente) correspondente bar (e observe que a line1 regexp também corresponde a uma linha que contém line1anything incluindo line10 ).

Se você quisesse combinar na seção primeiro começando com uma linha que corresponde a line1 e terminando com a próxima linha depois disso (ou na mesma linha) que corresponde a line5 , faça:

sed '/line1/,$!d;/line5/q' < file

(observe que, se não houver linha que corresponda a line5 após a primeira que corresponder a line1 , ela será impressa da linha line1 até o final do arquivo. Observe também que os padrões sed são < expressões básicas, enquanto awk são extensões estendidas.

    
por 26.01.2018 / 12:16