在 awk 中打印长整数

标签 printing awk printf gawk

我有一个管道分隔的提要文件,它有几个字段。由于我只需要几个,我想到了使用 awk为我的测试目的捕获它们。但是,我注意到 printf 如果我使用 会更改值"%d" .如果我使用 效果很好"%s" .
提要文件示例:

[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
但是,以下两个测试工作正常 -
[jaypal:~/Temp] awk -F"|" '{printf ("%s\n",$2)}' temp
19769904399993903   # Value remains same

[jaypal:~/Temp] awk -F"|" '{print $2}' temp
19769904399993903   # Value remains same
那么这是的限制吗? "%d" 无法处理长整数。如果是这样,为什么它会在数字上加一而不是截断它?
我已经用 试过了BSD GNU 的版本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

最佳答案

我相信这种情况下的基础数字格式是 IEEE double 型。所以改变的值是浮点精度错误的结果。如果确实有必要将大值视为数字并保持准确的精度,则最好使用具有处理任意精度算术能力(可能通过扩展)的 Perl、Ruby 或 Python 之类的东西。

关于在 awk 中打印长整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8857866/

相关文章:

c - 如何解决此打印输出问题?

python - 如何修复python中返回结果的显示格式

javascript - 使用jquery打印插件打印div不起作用

css - 为大表格打印 CSS

linux - 比较两个文件中的字段并在 shell 中打印到另一个文件

segmentation-fault - brk 调用后的 x86_64 printf 段错误

google-chrome - 重置打印机缓存以强制 Chrome 浏览器选择操作系统默认打印机

bash - 用于将文件从驼峰式转换为下划线的 awk/sed 脚本

regex - 无法使用 AWK 读取两个模式之间的行

c - 为什么文件仅包含第一次迭代的打印内容