43

在以下 awk 命令中

 awk '{sum+=$1; ++n} END {avg=sum/n; print "Avg monitoring time = "avg}' file.txt

我应该改变什么来删除科学计数法输出(显示为 1.5e-05 的非常小的值)?

我无法成功使用 OMFT 变量。

4

3 回答 3

58

您应该使用printfAWK 语句。这样您就可以指定填充、精度等。在您的情况下,%f控制字母似乎更合适。

于 2012-10-03T18:01:25.180 回答
10

我无法成功使用 OMFT 变量。

它实际上是OFMTo输出fm a t),例如:

awk 'BEGIN{OFMT="%f";print 0.000015}'

将输出:

0.000015

相对于:

awk 'BEGIN{print 0.000015}'

哪个输出:

1.5e-05

GNU AWK 手册说,如果你想符合 POSIX,它应该是浮点转换规范

于 2020-12-01T12:04:30.660 回答
3

设置-v OFMT='%f'(无需将其嵌入到我的 awk 语句中)在我想要从 awk 得到的只是对任意浮点数列求和的情况下对我有用。

正如 OP 所发现的, awk 产生的指数符号非常小,

$ some_accounting_widget | awk '{sum+=$0} END{print sum+0}'
8.992e-07  # Not useful to me

将 OFMT 设置为固定的,但也过于激进地四舍五入,

$ some_accounting_widget | awk -v OFMT='%f' '{sum+=$0} END{print sum+0}'
0.000001   # Oops. Rounded off too much. %f rounds to 6 decimal places by default.

指定小数位数让我得到了我需要的东西,

$ some_accounting_widget | awk -v OFMT='%.10f' '{sum+=$0} END{print sum+0}'
0.0000008992    # Perfect.
于 2021-02-09T01:48:31.403 回答