awk + imprime linhas da primeira linha até a palavra correspondente


8

Quero imprimir todas as linhas do arquivo até a palavra correspondente, aconselhe como fazer isso com o awk

por exemplo

Quero imprimir todas as linhas até a palavra PPP

observe que a primeira linha deve ser diferente de AAA (qualquer palavra)

cat file.txt

AAA   ( the first line/word chuld be any word !!!!! )
BBB
JJJ
OOO
345
211
BBB
OOO
OOO
PPP
MMM
(((
&&&

então eu preciso pegar isso

AAA
BBB
JJJ
OOO
345
211
BBB
OOO
OOO
PPP

outro exemplo (deseja imprimir até KJGFGHJ)

 cat file.txt1

 HG
 KJGFGHJ
 KKKK

então eu preciso pegar

 HG
 KJGFGHJ

Respostas:


12

Tentar:

$ awk '1;/PPP/{exit}' file
AAA
BBB
JJJ
OOO
345
211
BBB
OOO
OOO
PPP

5
O mesmo com acima via sed:sed '/PPP/q' infile
Costas

@ Costas: Sim, o OP quer awk, então eu não dou outras ferramentas.
cuonglm

O 1 no início é como uma declaração completa "// {print $ 0}" que sempre corresponde. O awk não imprime sem ele.
Cidermole

@idermole: Não exatamente. 1é como {print $0}. Observe também que //é um padrão vazio e o resultado não é especificado. É trabalho gawk, mawkversão própria de Brian Kernighan, mas não de nawk, oawkno baú de ferramentas de herança.
cuonglm

Obrigado pela solução sed! Eu só quero que feito e eu não me importo com ferramenta
Aaron McMillin

6

Como alternativa, use um padrão de intervalo correspondente à primeira linha (NR igual a 1) até a primeira correspondência de 'PPP' em uma linha

awk 'NR==1,/PPP/' file

se a linha deve corresponder exatamente a 'PPP', use apenas

awk 'NR==1,/^PPP$/' file

Se você deseja fazer o mesmo para cada arquivo na lista de argumentos, use a variável FNR que redefine 1 para a primeira linha de cada arquivo processado

awk 'FNR==1,/PPP/' file1 file2 ...

2

Como o OP disse que sua primeira linha ou palavra de arquivo pode conter qualquer palavra (como PPPela mesma), você precisa verificar isso e impedir a correspondência da primeira linha e evitar a awksaída de lá.

Então você pode tentar o seguinte:

Arquivo de entrada:

PPP # the first line/word chuld be any word !!!!! )
BBB
$$$
JJJ
OOO
PPP
345
PPP
%%%

Comando:

awk '1;/PPP/{if (NR>1) exit}' file

Resultado:

PPP # the first line/word chuld be any word !!!!! )
BBB
$$$
JJJ
OOO
PPP
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.