awk和mawk中的浮点比较
我无法理解为什么在mawk中浮点数比较不起作用:awk和mawk中的浮点比较,awk,mawk,Awk,Mawk,我无法理解为什么在mawk中浮点数比较不起作用: mawk '$3 > 10' file.txt [...] 9_6_F-repl 24834 38.8699 9_6_F 56523 17.9344 9_7_F 3196 3.68367 9_9_F 2278 2.37445 9_annua_M-merg 122663 163.557 9_huetii_F-merg 208077 172.775 [...] 虽然它在awk上做得很好,但如下所
mawk '$3 > 10' file.txt
[...]
9_6_F-repl 24834 38.8699
9_6_F 56523 17.9344
9_7_F 3196 3.68367
9_9_F 2278 2.37445
9_annua_M-merg 122663 163.557
9_huetii_F-merg 208077 172.775
[...]
虽然它在awk上做得很好,但如下所示:
awk '{if ($3 > 10) print $1}' file.txt
我在这里显然做错了什么,但我不明白是什么。如果文件有CRLF行终止符,它将失败。首先删除
\r
:
$ file foo
foo: ASCII text, with CRLF line terminators
$ mawk 'sub(/\r/,"") && ($3 > 10)' foo
9_6_F-repl 24834 38.8699
9_6_F 56523 17.9344
9_annua_M-merg 122663 163.557
9_huetii_F-merg 208077 172.775
或者,您可以使用dos2unix
等
EDIT2:如果使用逗号作为小数分隔符的区域设置,则会影响mawk中的浮点比较
在这种情况下,您可以:
1) 将区域设置为
LANG="en_US.UTF-8"
或
2) 将十进制分隔符更改为逗号,并将其管道化为mawk:
mawk '$3 > 10' <(cat file.txt | sed -e "s/\./,/")
mawk'$3>10'两个代码实际上并不相同,即使它们应该做相同的事情(第一个测试是在模式级别,第二个测试是在操作内部,针对第二个匹配的模式)。您是否使用mawk尝试awk版本?我尝试了上一个命令的mawk版本:mawk'{if($3>10)print$3}'file.txt
,结果相同,小于10的值不会被过滤掉,例如:17.9344;3.68367; 2.37445; 163.557; 172.775
。这可能与我的值中小数部分的长度不均匀有关吗?dos2unix foo&&mawk'$3>10'foo
仍然给出相同的结果。另外,mawk'sub(/\r/,“”)
不会给出任何结果(输出为空)。文件foo
的结果是foo:ASCII text
您使用的是哪种语言环境(键入locale
)?也许您的区域设置使用了另一个十进制分隔符,例如逗号。您是对的!这是区域设置问题。在我将句点改为逗号后,它工作得非常好:mawk'$3>10'它是“pl\u pl.UTF-8”
。将locale设置为LANG=“en\u US.UTF-8”
解决了问题,并且mawk'$3>10'foo
的工作方式与它应该的工作方式一样。