AWK大整数和

Ale*_*lex 5 awk

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

{sum+=$1} END {print sum}
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢!

Ken*_*ent 5

gnu awk 有-M选项,你可以试试。它应该为您保持精度。

MPFR and MP libraries当你编译GAWK,在运行时不应该使用。

这是一个例子,有或没有-Mgawk 4.1.0在 64 位 linux (Archlinux) 上测试:

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

kent$  awk -M 'BEGIN{printf "%d\n","368147000099999999999999999999999999"}'
368147000099999999999999999999999999
Run Code Online (Sandbox Code Playgroud)


dev*_*ull 1

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

cut -d' ' -f1 inputfile | paste -sd+ | bc -l
Run Code Online (Sandbox Code Playgroud)

编辑:根据您的评论,如果您想防止将输出拆分为多行,请设置BC_LINE_LENGTH0. 说:

cut -d' ' -f1 inputfile | paste -sd+ | BC_LINE_LENGTH=0 bc -l
Run Code Online (Sandbox Code Playgroud)