Awk número de impresión en ancho y redondearlo hacia arriba

20

Necesito imprimir un número, pero con el ancho dado y redondeado (¡con awk!)

%10s

Tengo esto y de alguna manera necesito conectarlo, %dpero todo lo que hago termina con demasiados parámetros para awk (porque tengo más columnas).

Vagabundo
fuente

Respuestas:

27

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.
Cuonglm
fuente
9

Usando el %fespecificador 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.

Andreas Wiese
fuente
es /dev/nullnecesario?
Avinash Raj
Si sus únicas declaraciones están en el BEGINbloque, no lo está. Primero probé con la expresión en el cuerpo normal, por lo tanto mea culpa. Gracias, @Gnouc.
Andreas Wiese
3

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.

Blake Barnett
fuente