Como faço para imprimir um campo de um arquivo separado por tubo?
Pergunta
Eu tenho um arquivo com campos separados por caracteres de pipe e quero imprimir apenas o segundo campo. Esta tentativa falhar:
$ cat file | awk -F| '{print $2}'
awk: syntax error near line 1
awk: bailing out near line 1
bash: {print $2}: command not found
Existe uma maneira de fazer isso?
Solução
O ponto chave aqui é que o caractere pipe (|
) deve ser escapado para o shell. Use "\|
" ou "'|'
" para protegê-lo de interpertation shell e permitir que ele seja passado para awk
na linha de comando.
Lendo os comentários, vejo que os presentes poster original de uma versão simplificada do problema original que envolveu filtragem file
antes de selecionar e imprimir os campos. Uma passagem através grep
foi usado e o resultado canalizada para awk para selecção de campo. Isso contas para o cat file
totalmente desnecessário que aparece na questão (que substitui o grep <pattern> file
).
Fine, que irá trabalhar. No entanto, awk é em grande parte uma ferramenta de correspondência de padrões por conta própria, e pode ser confiável para encontrar e trabalhar sobre as linhas de correspondência sem a necessidade de invocar grep
. Use algo como:
awk -F\| '/<pattern>/{print $2;}{next;}' file
O bit /<pattern>/
diz awk
para executar a ação que segue em linhas que correspondem a <pattern>
.
O {next;}
aparência perdida é uma ação padrão pular para a próxima linha na entrada. Não parece ser necessário, mas eu tenho esse hábito de há muito tempo ...
Outras dicas
Ou apenas usar um comando:
cut -d '|' -f FIELDNUMBER
O personagem tubulação precisa ser escapado para que o shell não interpretá-lo. Uma solução simples:
$ awk -F\| '{print $2}' file
Outra opção seria a de citar o personagem:
$ awk -F'|' '{print $2}' file
E 'arquivo' não contém símbolos de tubulação, para que ele imprime nada. Você deve usar 'file cat' ou simplesmente listar o arquivo após o programa awk.