Tenho vários arquivos com um formato como este
some text
some text
This section is for WXYZ
some text
some text
some text
some text
some text
some text (ABC) some text (CDF)
901 98
some text FFG
some text (FFG)
1 99
some text
some text
Estou tentando imprimir para cada arquivo
- o nome do arquivo
- a string após "Esta seção é para" na mesma linha
- a linha abaixo da string contendo
(ABC)
- a linha abaixo da string contendo
(FFG)
Este é meu script atual (com base na resposta neste tópico )
awk '/This section is for/{sub(/This section is for /,""); print FILENAME "|" $0}
a{print;a=0} /\(ABC\)/{a=1}
b{print;b=0} /\(FFG\)/{b=1}
' "testfile.txt"
Estou obtendo esta saída
testfile.txt|WXYZ
901 98
1 99
E minha saída desejada para cada arquivo seria uma única linha como esta
testfile.txt|WXYZ|901 98|1 99
Como modificar o script para obter meu objetivo? Obrigado
Assim, usando
printf "%s"
para evitar quebras de linha:Sempre que tenho uma entrada que contém pares de tag-valor, acho útil primeiro construir uma matriz desses mapeamentos (
f[]
abaixo) para separar a detecção do valor do uso do valor e, então, posso imprimir, comparar e modificar em qualquer ordem e combinação que eu quiser, apenas indexando a matriz com sua tag (nome).Por exemplo, usando qualquer awk:
Observe que isso forneceria consistentemente 4
|
campos de saída separados, mesmo se alguma das tags estivesse faltando em um arquivo de entrada.Já que você disse:
se você quisesse processar todos os arquivos de entrada de uma vez, você poderia fazer isso com o GNU awk:
ou isso com qualquer awk:
O GNU
AWK
adiciona um separador de linha de saída ao conteúdo deprint
, que por padrão é uma nova linha (\n
), você pode alterá-lo definindo outroORS
valor, neste caso específico, deixetestfile.txt
o conteúdo serentão
vai dar
Observe que há uma quebra
|
de linha no final, isso pode ser corrigido da seguinte maneiraque dá saída
Explicação: Eu mudo
ORS
para nova linha apósprint
ing a primeira de duas linhas, independentemente de quais linhas (a
oub
) vêm primeiro. Se você quiser saber mais sobre ORS, leia 8 Variáveis Internas Poderosas do Awk – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR(testado no GNU Awk 5.3.1)