Awk :
awk '{ for(i=1;i<=NF;i++) printf (i==1?"%s%s":"%6s%s"),$i,(i==NF? ORS:OFS) }' file
A saída:
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
Quero alinhar corretamente a terceira coluna usando awk ou qualquer outra ferramenta UNIX, de forma que todos os números de ponto flutuante estejam centralizados em relação ao ponto decimal.
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
Por favor, deixe-me saber se você tem alguma sugestão. Eu tentei usar métodos de formatação, mas para ponto flutuante parece que eles não estão funcionando.
Portanto, a saída esperada é
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
Para os dados de entrada no arquivo z6, código:
align z6
produz:
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
Detalhes do alinhamento do código (perl):
align Align columns of text. (what)
Path : ~/p/stm/common/scripts/align
Version : 1.7.0
Length : 270 lines
Type : Perl script, ASCII text executable
Shebang : #!/usr/bin/perl
Help : probably available with --help
Home : http://kinzler.com/me/align/ (doc)
Modules : (for perl codes)
Getopt::Std 1.10
Em um sistema como:
OS, ker|rel, machine: Linux, 3.16.0-4-amd64, x86_64
Distribution : Debian 8.9 (jessie)
bash GNU bash 4.3.30
align 1.7.0
Felicidades ... felicidades, drl
Isso pode ser feito usando a declaração awk
do printf
.
O motivo "%2.3f"
não funcionou porque, com %f<field-width>.<precision>
, a largura do campo é a largura total do campo, incluindo o ponto decimal e a parte da fração. <precision>
é o número de dígitos após o ponto decimal.
Quando você digitou %2.3f
, provavelmente espera ter 2 dígitos à esquerda da vírgula decimal e 3 dígitos à direita. Para fazer isso, use %6.3f
, que será alinhado no ponto decimal, contanto que haja dois ou menos dígitos à esquerda do ponto decimal.
Você pode tentar isso:
awk '{ printf "%-6s ", $1; for (i=2; i<=NF; i++) printf "%6.3f ", $i; printf "\n"; }'
Aqui está o mesmo código bem formatado para legibilidade e executado com dados de amostra. Eu adicionei alguns dados extras para que você possa ver o comportamento de formatação quando os dados de entrada são maiores que as larguras de campo:
$ awk '
{
printf "%-6s ", $1;
for (i = 2; i <= NF; i++)
printf "%6.3f ", $i;
printf "\n";
}
' <<EOF
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
Bundy 1.1 1.22 1.333
Jr 22.333 22.1 0.0
Longman 333.4444 4444.0 1.55555
EOF
Al 11.134 15.250 2.393
Al 11.134 5.825 2.393
Al 12.888 10.537 2.393
Bundy 1.100 1.220 1.333
Jr 22.333 22.100 0.000
Longman 333.444 4444.000 1.556
$
Veja as páginas awk
e printf(3)
man para mais detalhes.
Tags awk text-formatting