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).
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.
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.
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.