尴尬和莫克的浮点比较

  • 本文关键字:比较 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 '{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中的float比较。

在这种情况下,您可以:

1)将语言环境设置为

LANG="en_US.UTF-8"

2)将十进制分离器更改为逗号,然后将其管道到Mawk:

mawk '$3 > 10' <(cat file.txt | sed -e "s/./,/")

您不需要设置语言环境,但需要考虑奇怪或错误的输入:

如果输入具有DOT或任何字符,则比ASCII的字节条例高于" 1"。(很多东西):

9_6_F-repl      24834   9.
9_6_F   56523   9.
9_annua_M-merg  122663  9.
9_huetii_F-merg 208077  9.
9_annua_M-merg  122663  :5.333

这将完全无法产生正确的结果,因为将$3比较为字符串,其中ASCII" 9"。大于ASCII" 1":

mawk2 'sub("r*",_)*(10<$3)'
9_6_F-repl      24834   9.
9_6_F   56523   9.
9_annua_M-merg  122663  9.
9_huetii_F-merg 208077  9.
9_annua_M-merg  122663  9.
9_annua_M-merg  122663  :5.333

要纠正它,只需在$3旁边添加+

mawk 'sub("r*",_)*(10<+$3)'

如果您不太关心古老的gawk -P/-c/-t模式,则更简单:

mawk '10<+$3' RS='r?n'

ORS代表您照顾r :: Cr 。通过将?放置在RS Regex上,您可以跳过有关使用iconvdos2unix或更改locale设置的所有步骤::

  • RS ----&gt;ORS会无缝处理

这样,原始输入文件仍然完好无损,以防稍后出于某种原因需要这些CR。

最新更新