sprintf 在 GNU Awk 3.1.5 和 GNU Awk 3.17 中的行为不同

Posted

技术标签:

【中文标题】sprintf 在 GNU Awk 3.1.5 和 GNU Awk 3.17 中的行为不同【英文标题】:sprintf behaves differently in GNU Awk 3.1.5 and GNU Awk 3.17 【发布时间】:2016-08-27 15:50:41 【问题描述】:

在 bash 终端中考虑以下命令:

echo 0.00027849383762390271 | awk 'print sprintf("%.20f",$1)'

我连接到两台机器。

第一个有 GNU Bash 4.15 版和 GNU Awk 3.1.7 版。上面的命令返回预期的结果:0.00027849383762390268(虽然最后两位数字与我的初始数字不同)

第二台机器有 GNU Bash 版本 3.2.39 和 GNU Awk 版本 3.1.5。上面的命令返回:0,00000000000000000000(逗号后 20 个零)。注意“,”而不是“。” .

为什么第二台机器的行为与第一台机器不同,以及如何使其表现得像第一台机器?

【问题讨论】:

【参考方案1】:

两台机器之间的区域设置不同。在执行这两个命令之前设置LC_ALL=C(或任何你想要的语言环境),并查看https://www.gnu.org/software/gawk/manual/html_node/Locale-influences-conversions.html了解更多信息。

【讨论】:

我从同一台本地计算机 ssh 到两台机器。那么为什么他们的行为不同呢?机器中是否有一些设置不同的变量?顺便说一句,按照您的建议设置 LC_ALL 是可行的。这是整个命令:echo 0.00027849383762390271 | LC_ALL=C awk 'print sprintf("%.20f",$1)' 是的,有一些变量或配置文件,但不知道在哪里/什么。谷歌locale 开始调试。在两台机器上运行env 并查找差异等...

以上是关于sprintf 在 GNU Awk 3.1.5 和 GNU Awk 3.17 中的行为不同的主要内容,如果未能解决你的问题,请参考以下文章

Linux文本处理三剑客之GNU awk的使用

是否可以通过 GNU 并行将 awk 写入多个文件?

你如何在GNU Awk 4.2中跳过使用FIELDWIDTHS的字符?

Linux系统管理——GNU awk使用方法及技巧

使用 GNU AWK 处理引用字段中的数据

GNU awk (gawk) 中涉及 NaN 的令人惊讶的数值比较结果