我有以下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] 删除。
我来说两句