对十进制值求和时,awk总和中需要全十进制

给求

我有以下test.txt文件-

var,value
a,1.1234
b,1.7896749
c,2.4982
d,1.2976232

当我使用以下命令时-

awk -F ',' '{SUM+=$2}END{print SUM}' test.txt

它打印6.7089

但是带有所有小数位的结果是6.7088981如何编写命令,以便它不仅在这种特定情况下,而且在一般情况下,在结果中打印所有小数位。例如,如果结果有10个小数位,它应该打印所有10个小数位吗?如果结果只有5个小数位,则应仅打印5个小数位。我使用的操作系统是Red Hat Enterprise Linux Server 7.7

斯蒂芬·查泽拉斯

打印后,将使用OFMT包含printf格式规范(默认为%.6g特殊变量将非整数转换为十进制字符串表示形式您可以对其进行更改,%.17g以获取IEEE 754双精度二进制浮点数的最大精度(awk大多数系统的大多数实现在内部使用)。CONVFMT在将浮点数隐式转换为字符串的其他情况下(例如,当您将数字与其他内容连接时),将使用另一个变量(

这些双精度值不会使您获得更高的精度,没有任何意义超越17。已经达到17的情况下,您可能会看到一些伪像。如果您不需要那么高的精度,则15个有效数字可能会更好。

$ awk -v OFMT=%.17g -F ',' '{SUM+=$2};END{print SUM}' < file
6.7088981000000008
$ awk -v OFMT=%.15g -F ',' '{SUM+=$2};END{print SUM}' < file
6.7088981

虽然OFMT会影响所有打印的浮点数,但您也可以printf直接使用所需的精度来打印数字。

$ awk  -F ',' '{SUM+=$2};END{printf "%.15g\n", SUM}' < file
6.7088981

awk从4.1.0版开始的GNU实现也可以使用任意精度算术支持进行编译(请参阅参考资料info gawk 'Arbitrary Precision Arithmetic')。如果您的系统上是这种情况,您还可以执行以下操作:

gawk -M -v PREC=256 -v OFMT=%.60g -F ',' '{SUM+=$2};END{print SUM}' < file

例子:

$ printf 'x,%s\n' 1 1000000000000000000000000000000000.00000000001 |
> gawk -v OFMT=%.15g -F ',' '{SUM+=$2};END{print SUM}'
999999999999999945575230987042816
$ printf 'x,%s\n' 1 1000000000000000000000000000000000.00000000001 |
> gawk -M -v PREC=256 -v OFMT=%.60g -F ',' '{SUM+=$2};END{print SUM}'
1000000000000000000000000000000001.00000000001

这里的另一种方法可能是使用bc(假设这些数字总是这样表示(例如0.001,不是1e-3)):

<file tail -n+2 | # skip header
  cut -d, -f2   | # extract second field
  paste -sd + - | # join input lines with +
  bc

后面的位数.将是任何输入记录中的最大值。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章