AWK大整数之和

时间:2014-01-22 08:21:49

标签: awk

我正在尝试使用日志文件中的整数列表     awk

{sum+=$1} END {print sum}

问题是结果大于我的limits.h文件中指定的MAX_INT,因此打印返回 3.68147e + 09

是否有优雅的方式来打印总和的全部价值?

谢谢!

4 个答案:

答案 0 :(得分:3)

gnu awk有-M选项,您可以尝试使用它。它应该保持精确度。

编译gawk时应使用MPFR and MP libraries,而不是在运行时。

这是一个例子,有或没有-M。在64位linux(Archlinux)上使用gawk 4.1.0进行了测试:

kent$  awk 'BEGIN{printf "%d\n","368147000099999999999999999999999999"}'  
368147000099999983291776543710248960

kent$  awk -M 'BEGIN{printf "%d\n","368147000099999999999999999999999999"}'
368147000099999999999999999999999999

答案 1 :(得分:1)

awk没有足够大的数据的整数类型,并将总和提升为浮点数。据我所知,awk中没有数据类型,其精度足以满足您的要求。即问题不在于印刷; awk字面上没有你想要的信息。

例如,您可以尝试使用ruby(它将整数提升为大整数而不是浮点数):

ruby -nae 'BEGIN{sum=0}; END{puts sum}; sum+=$F[0].to_i'

答案 2 :(得分:0)

您可以使用支持任意精度算术的bc。相当于你想要实现的目标是:

cut -d' ' -f1 inputfile | paste -sd+ | bc -l

编辑:根据您的评论,如果您想阻止将输出分成多行,请将BC_LINE_LENGTH设置为0。说:

cut -d' ' -f1 inputfile | paste -sd+ | BC_LINE_LENGTH=0 bc -l

答案 3 :(得分:0)

我很确定AWK在内部使用双倍算术,因此超出一定限度,你将失去精度。

如果它可以帮助您,请查看此链接。

Adding large number using AWK issue cases