Gostaria de extrair dados de um arquivo e organizá-los em uma grande tabela de larguras fixas. Posso esperar que esta tabela tenha várias colunas, digamos 30 colunas. Se eu criar esta tabela usando a awk
linha de comando tradicional, precisarei escrever uma awk
linha de comando muito longa, algo semelhante ao seguinte:
awk '{printf "%-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s %-5s\n", $1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24,$25,$26,$27,$28,$29,$30}'
Existe alguma maneira de tornar este linear mais curto? Por exemplo, estou pensando em implementar um array dentro do comando long anterior. Este array vai dizer awk
quais são os números e as larguras das colunas que eu gostaria de criar, ao invés de definir cada coluna separadamente, algo como:
awk 'BEGIN {for i in {1..30}; do echo %-5s\n print i}
Como posso implementar isso corretamente awk
para criar várias colunas de largura fixa?
Você pode fazer a impressão, ela mesma, dentro de um loop, um campo por vez.
Observe que a impressão da nova linha é necessária após o loop para evitar que várias linhas sejam mescladas em uma.
por exemplo
Você poderia (mas eu não recomendo isso) construir alguns vars em etapas (um exemplo no bash):
Mas você também pode fazer tudo dentro do awk:
split
inawk
usará o mesmo regexFS
usado para dividir a linha em campos e colocar cada valor no arraya
.for
loop vai (automático) em todos os campos.printf
irá imprimir todos os campos com o mesmo formato.print
colocará uma nova linha no final da linha.Isso é mais flexível, pois funcionará para qualquer quantidade de campos, mesmo linhas com número variável de campos. E está completo dentro de apenas um idioma (mais fácil de entender e manter).
Ou ainda:
Você pode alterar o formato para
%-5.5s
cortar campos com mais de 5 caracteres.Observe que o printf do awk conta incorretamente o caractere decomposto
é
como dois caracteres. Parece contar pontos de código Unicode (um problema comum) em vez de clusters Unicode.EDIT Respondendo a esta pergunta adicional dos comentários:
Basta adicionar o código necessário: