我发现了一些关于此的问题,但没有一个真正回答我的问题。
我有一个像这样的表格文件:
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}'时它正常工作
答案 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为什么,可能是其他一些语言环境效应)。