AWK printf数的宽度并四舍五入


20

我需要打印出一个数字,但要给定宽度并四舍五入(用awk!)

%10s

我有这个,以某种方式我需要连接,%d但是我所做的一切最终导致awk的参数过多(因为我有更多的列)。

Answers:


27

您可以尝试以下方法:

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

我们的格式选项包括两个部分:

  • 3:表示输出将填充为3个字符。
  • .0f:表示输出将没有精度,表示四舍五入。

从中man awk,您可以看到更多详细信息:

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.

9

使用%f格式说明符,您的(浮点数)数字将根据您的指定自动舍入。例如,要将值四舍五入为整数,请使用

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

如果您想要更多的尾随数字,只需更改精度。


/dev/null必要吗?
2014年

如果您的唯一语句在BEGIN块中,则不是。我首先在正常人体中测试了表达,因此进行了测试。谢谢,@ Gnouc。
2014年

3

Awk在下面使用sprintf,并且进行无偏四舍五入,因此根据您的平台,如果希望始终对其进行四舍五入,则可能需要使用以下方法:

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

不意识到这一点会导致细微但令人讨厌的错误。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.