Como usar o Awk para imprimir campos e colunas em arquivo
Nesta parte de nossa série de comandos Linux Awk, daremos uma olhada em um dos recursos mais importantes do Awk, que é a edição de campos.
É bom saber que o Awk divide automaticamente as linhas de entrada fornecidas em campos, e um campo pode ser definido como um conjunto de caracteres que são separados de outros campos por um separador de campo interno.
Se você está familiarizado com Unix/Linux ou faz programação bash shell, então você deve saber o que é a variável separadora de campo interna (IFS). Os IFS padrão no Awk são tabulação e espaço.
É assim que funciona a ideia de separação de campos no Awk: quando ele encontra uma linha de entrada, de acordo com o IFS definido, o primeiro conjunto de caracteres é o campo um, que é acessado usando $1<, o segundo conjunto de caracteres é o campo dois, que é acessado usando $2, o terceiro conjunto de caracteres é o campo três, que é acessado usando $3 e assim por diante até o último conjunto de caracteres.
Para entender melhor essa edição de campos do Awk, vamos dar uma olhada nos exemplos abaixo:
Exemplo 1: Criei um arquivo de texto chamado tecmintinfo.txt.
vi tecmintinfo.txt
cat tecmintinfo.txt
Então, na linha de comando, tento imprimir os campos primeiro, segundo e terceiro do arquivo tecmintinfo.txt >usando o comando abaixo:
$ awk '//{print $1 $2 $3 }' tecmintinfo.txt
TecMint.comisthe
Na saída acima, você pode ver que os caracteres dos três primeiros campos são impressos com base no IFS definido, que é o espaço:
- O campo um, “TecMint.com ”, é acessado usando
$1
. - O campo dois, que é “is ”, é acessado usando
$2
. - O campo três, que é “o ”, é acessado usando
$3
.
Se você notou na saída impressa, os valores dos campos não estão separados e é assim que a impressão se comporta por padrão.
Para visualizar a saída claramente com espaço entre os valores dos campos, você precisa adicionar o operador (,)
da seguinte forma:
$ awk '//{print $1, $2, $3; }' tecmintinfo.txt
TecMint.com is the
Uma coisa importante a ser observada e sempre lembrada é que o uso de ($)
no Awk é diferente de seu uso em scripts de shell.
No shell script, ($)
é usado para acessar o valor das variáveis, enquanto no Awk ($)
ele é usado apenas para acessar o conteúdo de um campo, mas não para acessar o valor das variáveis.
Exemplo 2: Vamos dar uma olhada em outro exemplo usando um arquivo que contém múltiplas linhas chamado my_shoping.list.
No Item_Name Unit_Price Quantity Price
1 Mouse #20,000 1 #20,000
2 Monitor #500,000 1 #500,000
3 RAM_Chips #150,000 2 #300,000
4 Ethernet_Cables #30,000 4 #120,000
Digamos que você queira imprimir apenas Unit_Price
de cada item da lista de compras, você precisará executar o comando abaixo:
$ awk '//{print $2, $3 }' my_shopping.txt
Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000
Awk também possui um comando printf
que ajuda você a formatar sua saída, é uma boa maneira, pois você pode ver que a saída acima não é clara o suficiente.
Usando printf
para formatar a saída de Item_Name e Unit_Price:
$ awk '//{printf "%-10s %s\n",$2, $3 }' my_shopping.txt
Item_Name Unit_Price
Mouse #20,000
Monitor #500,000
RAM_Chips #150,000
Ethernet_Cables #30,000
Resumo
A edição de campos é muito importante ao usar o Awk para filtrar texto ou strings, pois ajuda a obter dados específicos em colunas de uma lista. E lembre-se sempre que o uso do operador ($)
no Awk é diferente daquele no shell scripting.
Espero que o artigo tenha sido útil para você e, para quaisquer informações adicionais necessárias ou dúvidas, você pode postar um comentário na seção de comentários.