使用awk

时间:2018-04-16 15:27:40

标签: bash macos awk

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

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

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}'时它正常工作

1 个答案:

答案 0 :(得分:5)

这是您的区域设置(请参阅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

然后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为什么,可能是其他一些语言环境效应)。