在awk中打​​印长整数

jay*_*ngh 8 printing awk printf gawk

我有一个管道分隔的feed文件,它有几个字段.由于我只需要一些,我想用它awk来捕获它们用于我的测试目的.但是,我注意到printf如果我使用它会更改值"%d".如果我使用,它工作正常"%s".

Feed文件示例:

[jaypal:~/Temp] cat temp

302610004125074|19769904399993903|30|15|2012-01-13 17:20:02.346000|2012-01-13 17:20:03.307000|E072AE4B|587244|316|13|GSM|1|SUCC|0|1|255|2|2|0|213|2|0|6|0|0|0|0|0|10|16473840051|30|302610|235|250|0|7|0|0|0|0|0|10|54320058002|906|722310|2|0||0|BELL MOBILITY CELLULAR, INC|BELL MOBILITY CELLULAR, INC|Bell Mobility|AMX ARGENTINA SA.|Claro aka CTI Movil|CAN|ARG|

我有兴趣捕捉second column它是哪个19769904399993903.

这是我的测试:

[jaypal:~/Temp] awk -F"|" '{printf ("%d\n",$2)}' temp
19769904399993904   # Value is changed
Run Code Online (Sandbox Code Playgroud)

但是,以下两个测试工作正常 -

[jaypal:~/Temp] awk -F"|" '{printf ("%s\n",$2)}' temp
19769904399993903   # Value remains same

[jaypal:~/Temp] awk -F"|" '{print $2}' temp
19769904399993903   # Value remains same
Run Code Online (Sandbox Code Playgroud)

所以这是一个"%d"无法处理长整数的限制.如果是这样的话,为什么会在数字中加一个而不是截断呢?

我试过这个BSDGNU版本的awk.

版本信息:

[jaypal:~/Temp] gawk --version
GNU Awk 4.0.0
Copyright (C) 1989, 1991-2011 Free Software Foundation.

[jaypal:~/Temp] awk --version
awk version 20070501
Run Code Online (Sandbox Code Playgroud)

小智 10

GNU awk 4.1开始,您可以使用--bignum-M

$ awk 'BEGIN {print 19769904399993903}'
19769904399993904

$ awk --bignum 'BEGIN {print 19769904399993903}'
19769904399993903
Run Code Online (Sandbox Code Playgroud)

§命令行选项


Mar*_*ins 5

我相信这种情况下的基础数字格式是IEEE双精度格式.因此,更改的值是浮点精度错误的结果.如果实际上有必要将大值视为数值并保持准确的精度,那么使用Perl,Ruby或Python等具有(可能通过扩展)功能来处理任意精度算术的功能可能会更好.