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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top