Aqui está uma solução no awk que determina dinamicamente as larguras de coluna necessárias. Ele pode pegar qualquer número de campos em cada linha, mas assume que o campo final é um inteiro. Os inteiros são formatados para se alinharem à direita, conforme desejado.
format.awk
#!/usr/bin/awk -f
# Format text and numbers into two columns
# Written by PM 2Ring 2015.04.16
#Gather data, line by line
{
#Split name from number
match($0, /^(.*) ([0-9]+)[[:space:]]*$/, a)
#printf "%d: %s -> [%s] [%s]\n", NR, $0, a[1], a[2]
#Store name & number into arrays
name[NR] = a[1]
num[NR] = a[2]
#Update field widths
namelen = length(a[1])
if (namelen > maxname)
maxname = namelen
numlen = length(a[2])
if (numlen > maxnum)
maxnum = numlen
}
#Print re-formatted data
END{
for(i=1; i<=NR; i++)
#Use printf's '*' modifier to specify field widths
printf "%-*s %*d\n", maxname, name[i], maxnum, num[i]
}
saída
Person 49
Persons Boss 3
HR 21
CEO 93
System Administrator 2
Você pode chamar o script assim:
$ awk -f format.awk data_filename
Você também pode enviar os dados de texto para ele. E se você usar chmod
para conceder permissões de execução, você poderá executá-las como qualquer outro comando.
Obviamente, isso é um pouco mais elaborado do que a solução de Costa que usa sed
para pré-processar a entrada para column
. Então sugiro usar isso, a menos que você realmente queira que os números sejam justificados à direita. :) OTOH, embora este script pareça maior que o one-liner de Costa, awk
é muito rápido, então espero que essa solução seja comparável em velocidade à de Costa, mesmo com arquivos de dados realmente grandes.