Awk printf número de largura e arredondá-lo

17

Eu preciso imprimir printf , mas com largura e arredondado (com awk!)

%10s

Eu tenho isso e de alguma forma eu preciso conectar o %d , mas tudo o que faço termina com muitos parâmetros para o awk (porque eu tenho mais colunas).

    
por Wanderer 20.05.2014 / 09:29

3 respostas

22

Você pode tentar isso:

$ awk 'BEGIN{printf "%3.0f\n", 3.6}'
  4

Nossa opção de formato tem duas partes:

  • 3 : a saída de significado será preenchida com 3 caracteres.
  • .0f : a saída de significado não terá precisão, ou seja, arredondada.

De man awk , você pode ver mais detalhes:

width   The field should be padded to this width. The field is normally padded
        with spaces. If the 0  flag  has  been  used, it is padded with zeroes.

.prec   A number that specifies the precision to use when printing.  For the %e,
        %E, %f and %F, formats, this specifies the number of digits you want
        printed to the right of the decimal point. For the %g, and %G formats,
        it specifies the maximum number of significant  digits. For the %d, %o,
        %i, %u, %x, and %X formats, it specifies the minimum number of digits to
        print. For %s, it specifies the maximum number of characters from the
        string that should be printed.
    
por 20.05.2014 / 09:35
7

Usando o especificador de formato %f , o seu número (ponto flutuante) será arredondado automaticamente conforme você especificar. Por exemplo, para arredondar um valor para números inteiros, use

$ awk 'BEGIN { printf("%.0f\n", 1.49); }'
1
$ awk 'BEGIN { printf("%.0f\n", 1.5); }'
2

Se você quiser mais dígitos finais, basta alterar a precisão.

    
por 20.05.2014 / 09:36
2

O Awk usa o sprintf por baixo e faz um arredondamento imparcial, portanto, dependendo da sua plataforma, se você quiser que ele SEJA SEMPRE arredondado, talvez seja necessário usar algo assim:

awk "BEGIN { x+=(5/2); printf('%.0f', (x == int(x)) ? x : int(x)+1) }"

Não perceber isso pode levar a bugs sutis, mas desagradáveis.

    
por 12.02.2015 / 21:32