awk '
BEGIN {
fmt="%-15s%-10s%-10s%-10s%-10s%-10s\n"
printf fmt,"Name","Age","Sex","Weight","Home","Phone"
print "---------"
}
{
v=$0
sub(/[^:]*: /, "", v)
a[$1]=v
}
/Phone/ {
printf fmt,a["NAME:"],a["Age:"],a["Sex:"],a["Weight:"],a["Home"],a["Phone"]
delete a
}
END{
print "---------\nFile Complete"
}' file*
O uso de guias duplas entre colunas é problemático. Se houver, digamos, nomes longos e nomes curtos, as colunas podem confundir e acabar nos lugares exatamente errados. No acima, eu formatei colunas com larguras dadas. Você pode precisar ajustar as larguras para obter melhores resultados.
Observe que FS=":"
também pode causar problemas. Campos podem conter dois pontos e isso confundiria a contagem. Isso pode ser evitado quebrando as informações no primeiro cólon como as instruções abaixo. Essas instruções capturam todas as informações do arquivo em uma matriz a
:
v=$0
sub(/[^:]*: /, "", v)
a[$1]=v
O primeiro campo é a chave. Tudo depois do primeiro espaço de dois pontos é o valor.
Um único comando awk pode processar muitos arquivos. Como acima, todos os arquivos correspondentes ao glob file*
são processados. Substitua isso por qualquer glob que corresponda aos seus arquivos de dados.
O acima processa uma pessoa de cada vez. Isso significa que esse código não requer memória grande e, consequentemente, é adequado para grandes conjuntos de dados.
Saída de amostra
$ bash script.sh
Name Age Sex Weight Home Phone
---------
Matty Nigan 65 M XX XXXXX XXX XXX XXXX
---------
File Complete