colunas centralizadas decimais unix

1

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
    
por Prasanth 16.10.2017 / 21:21

3 respostas

0
Solução

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
    
por 16.10.2017 / 21:23
0

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

    
por 16.10.2017 / 21:54
0

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.

    
por 16.10.2017 / 21:38