Awk printf number in width and round it up

You can try this:

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

Our format option has two parts:

  • 3: meaning output will be padded to 3 characters.
  • .0f: meaning output will have no precision, meaning rounded up.

From man awk, you can see more details:

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.

Using the %f format specifier, your (floating point) number will get automatically rounded as you specify. For example, to round a value to whole numbers use

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

If you want further trailing digits, just change precision.


Awk uses sprintf underneath and it does unbiased rounding, so depending on your platform if you want it to ALWAYS round up you may need to use something like this:

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

Not realizing this can lead to subtle but nasty bugs.