Awk stampa il numero in larghezza e arrotondalo per eccesso


20

Ho bisogno di stampare un numero, ma con la larghezza data e arrotondata (con awk!)

%10s

Ho questo e in qualche modo ho bisogno di connettere il %dma tutto quello che faccio, finisce con troppi parametri per awk (perché ho più colonne).

Risposte:


27

Puoi provare questo:

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

La nostra opzione di formato ha due parti:

  • 3: significa che l'output verrà riempito con 3 caratteri.
  • .0f: significa che l'output non avrà precisione, significato arrotondato per eccesso.

Da man awk, puoi vedere maggiori dettagli:

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.

9

Utilizzando l'identificatore di %fformato, il numero (in virgola mobile) verrà arrotondato automaticamente come specificato. Ad esempio, per arrotondare un valore a numeri interi utilizzare

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

Se vuoi ulteriori cifre finali, basta cambiare la precisione.


è /dev/nullnecessario?
Avinash Raj,

Se le tue uniche dichiarazioni sono nel BEGINblocco, non lo è. Ho provato prima con l'espressione nel corpo normale, quindi mea culpa. Grazie, @Gnouc.
Andreas Wiese,

3

Awk usa sprintf sotto e fa arrotondamenti imparziali, quindi a seconda della tua piattaforma se vuoi SEMPRE arrotondare potresti aver bisogno di usare qualcosa del genere:

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

Non accorgersene può portare a bug sottili ma cattivi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.