Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
awk和mawk中的浮点比较_Awk_Mawk - Fatal编程技术网

awk和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中浮点数比较不起作用:

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
的工作方式与它应该的工作方式一样。