【问题标题】:Greater than float with awk大于 awk 的浮点数
【发布时间】:2018-09-26 09:52:39
【问题描述】:

我发现了一些关于此的问题,但没有一个真正回答我的问题。

我有一个这样的表格文件:

2   10610   0   0   0   0.0105292
2   10649   0   0   0   0.041959
2   10682   0   0   0   0.0449746
2   10705   0   0   0   0.0441639
2   10797   2   0   0   0.0342728
2   10955   0   0   0   0.0136986
2   10957   0   0   0   0.0135135
2   11124   0   0   0   0.0583367
2   11336   1   0   0   0.0219502

我使用了这个命令:

awk '{if ($6 > 0.4) print $6}' myfile

这是输出:

0.0105292
0.041959
0.0449746
0.0441639
0.0342728
0.0136986
0.0135135
0.0583367
0.0219502

它返回第 6 列的所有值。在这里我不应该得到任何结果,因为条件没有得到尊重。所以我猜 awk 并没有将 $6 视为浮点数。

我尝试了其他语法,但仍然遇到同样的问题。

我也尝试了第一列的命令,它在那里工作......

ps:我在 MacOSX 上

编辑:虽然当我使用 awk '{print $6}' 时它可以工作

【问题讨论】:

  • 您的awk 可能已损坏。试试这个awk '$6+0>0.4{print $6}'
  • 您的意思是0.4 还是0.04
  • 你知道你的情况永远不是真的,对吧?您第 6 列中的所有数据都低于0.4。也许您的意思是 0.04 ?在这种情况下,您的awk 命令seems to work well
  • 感谢您解决问题。问题出在您的语言环境设置上,因此请尝试使用指定的 C 语言环境运行它:LC_ALL=C awk '{if ($6 > 0.4) print $6}' myfile,一旦您确认可以修复它,我将添加一个答案并说明原因。
  • 成功了!谷歌搜索后,我不确定这里发生了什么,但它确实有效!谢谢

标签: bash macos awk


【解决方案1】:

这是您的语言环境设置(请参阅https://www.gnu.org/software/gawk/manual/gawk.html#Locales,特别是https://www.gnu.org/software/gawk/manual/gawk.html#Locale-influences-conversions),明确​​设置 LC_ALL=C 是解决问题的一种方法:

LC_ALL=C awk '{if ($6 > 0.4) print $6}' myfile

发生的情况是,您尝试使用小数点 .,但您的语言环境(在大多数欧洲国家和许多其他国家/地区很常见)却使用 ,。因此,当您的输入包含:

0.0105292

awk 不会将它识别为在您的语言环境中看起来像一个数字,因此它被视为一个字符串。如果您的输入是:

0,0105292

THEN awk 会将其识别为数字(因此这是解决问题的另一种方法 - 在输入中使用逗号作为小数点)。

所以要 awk 你的代码:

$6 > 0.4

是一个字符串 "0.0105292" 与数字 0.4 进行比较(根据 POSIX,. 在代码中使用时始终是小数点)并且根据 gawk 中的这个比较表手册:

        +----------------------------------------------
        |       STRING          NUMERIC         STRNUM
--------+----------------------------------------------
        |
STRING  |       string          string          string
        |
NUMERIC |       string          numeric         numeric
        |
STRNUM  |       string          numeric         numeric
--------+----------------------------------------------

我们看到当一个字符串与一个数字(或其他任何东西)进行比较时执行的比较类型是字符串比较。

因此,在您的原始代码中,字符串 "0.0105292" 正在与数字 0.4 进行字符串比较,而 awk 显然决定前者大于后者(idk 为什么,可能是其他一些语言环境影响)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多