Necesito imprimir un número, pero con el ancho dado y redondeado (¡con awk!)
%10s
Tengo esto y de alguna manera necesito conectarlo, %d
pero todo lo que hago termina con demasiados parámetros para awk (porque tengo más columnas).
Puedes probar esto:
$ awk 'BEGIN{printf "%3.0f\n", 3.6}'
4
Nuestra opción de formato tiene dos partes:
3
: lo que significa que la salida se rellenará con 3 caracteres..0f
: lo que significa que la salida no tendrá precisión, lo que significa redondeado hacia arriba.Desde man awk
, puedes ver más detalles:
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.
Usando el %f
especificador de formato, su número (punto flotante) se redondeará automáticamente según lo especifique. Por ejemplo, para redondear un valor a números enteros use
$ awk 'BEGIN { printf("%.0f\n", 1.49); }'
1
$ awk 'BEGIN { printf("%.0f\n", 1.5); }'
2
Si desea más dígitos finales, simplemente cambie la precisión.
/dev/null
necesario?BEGIN
bloque, no lo está. Primero probé con la expresión en el cuerpo normal, por lo tanto mea culpa. Gracias, @Gnouc.Awk usa sprintf debajo y realiza un redondeo imparcial, por lo que, dependiendo de su plataforma, si desea que se redondee SIEMPRE, es posible que deba usar algo como esto:
awk "BEGIN { x+=(5/2); printf('%.0f', (x == int(x)) ? x : int(x)+1) }"
No darse cuenta de esto puede conducir a errores sutiles pero desagradables.
fuente