A maneira como o awk funciona é que, por padrão, ele percorre cada linha de texto e divide cada item separado por espaço em campos, nesse caso temos campos $ 2, $ 3 e $ 4 de juros. Agora, e se pudéssemos armazenar cada campo de $ 2 de cada linha em uma lista e depois imprimi-lo? É aí que as matrizes podem ajudar.
Tratando o corpo de um código awk como um grande loop while, podemos separar os campos 2,3 e 4 em matrizes apropriadas. Com cada linha, os arrays serão preenchidos. Então, basicamente, classificamos tudo em colunas (arrays) à medida que avançamos nas linhas. Uma vez feito isso, podemos passar por um loop imprimindo cada coluna (array) separadamente, enquanto apenas adicionando o texto "Column #".
$ awk '{ array1[NR]=$2;array2[NR]=$3;array3[NR]=$4} END{for(i=1;i<=NR;i++){print "Column"i" "array1[i]};printf "\n";for(i=1;i<=NR;i++){print "Column"i" "array2[i]}; printf"\n"; for(i=1;i<=NR;i++){print "Column"i" "array3[i] };printf "\n" }' columns.txt
Column1 a
Column2 1
Column3 x
Column1 b
Column2 2
Column3 y
Column1 c
Column2 3
Column3 z
É claro que uma longa linha é um pouco difícil de usar (sem trocadilhos intencionais). Podemos colocar tudo em um script:
#!/usr/bin/awk -f
{ array1[NR]=$2;array2[NR]=$3;array3[NR]=$4 }
END{
for(i=1;i<=NR;i++){
print "Column"i" "array1[i]};printf "\n";
for(i=1;i<=NR;i++){
print "Column"i" "array2[i]}; printf"\n";
for(i=1;i<=NR;i++){
print "Column"i" "array3[i] };printf "\n"
}
Chame esse script columnate.awk
, altere as permissões para executável com chmod +x columnate.awk
e execute-o com qualquer arquivo de texto como parâmetro:
$ ./columnate.awk columns.txt
Column1 a
Column2 1
Column3 x
Column1 b
Column2 2
Column3 y
Column1 c
Column2 3
Column3 z