web-dev-qa-db-fra.com

Awk printf nombre en largeur et arrondissez-le

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

%10s

Je l'ai et je dois en quelque sorte connecter le %d mais tout ce que je fais, se retrouve avec trop de paramètres pour awk (car j'ai plus de colonnes).

22
Wanderer

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 pas de 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.
29
cuonglm

En utilisant le %f spé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.

10
Andreas Wiese

Awk utilise sprintf en dessous et il effectue un arrondi non biaisé, 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.

3
Blake Barnett