我不明白为什么浮点数比较在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上,您可以跳过有关使用iconv
或dos2unix
或更改locale
设置的所有步骤::
-
RS
----&gt;ORS
会无缝处理
这样,原始输入文件仍然完好无损,以防稍后出于某种原因需要这些CR。