Awk printf nombre en largeur et arrondissez-le


20

J'ai besoin d' imprimer un nombre, mais avec une largeur donnée et arrondie (avec awk!)

%10s

J'ai cela et je dois en quelque sorte connecter le %dmais tout ce que je fais, se retrouve avec trop de paramètres pour awk (parce que j'ai plus de colonnes).

Réponses:


27

Vous pouvez essayer ceci:

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

Notre option de format comprend deux parties:

  • 3: ce qui signifie que la sortie sera complétée à 3 caractères.
  • .0f: ce qui signifie que la sortie n'aura aucune précision, ce qui signifie arrondi.

De man awk, vous pouvez voir plus de détails:

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

En utilisant le %fspécificateur de format, votre nombre (à virgule flottante) sera automatiquement arrondi comme vous le spécifiez. Par exemple, pour arrondir une valeur en nombres entiers, utilisez

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

Si vous voulez d'autres chiffres de fin, changez simplement la précision.


est /dev/nullnécessaire?
Avinash Raj

Si vos seules déclarations sont dans le BEGINbloc, ce n'est pas le cas. J'ai d'abord testé avec l'expression dans le corps normal, donc mea culpa. Merci, @Gnouc.
Andreas Wiese

3

Awk utilise sprintf en dessous et il arrondit de manière impartiale, donc en fonction de votre plate-forme si vous voulez qu'il arrondisse TOUJOURS, vous devrez peut-être utiliser quelque chose comme ceci:

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

Ne pas s'en rendre compte peut conduire à des bugs subtils mais désagréables.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.