的问题是,你正在试图做的数值比较与不使用支持的情况下独立nan
符号一个awk数字值(可能inf
),并获得不良结果。
通常,所有的awk值都是数字或字符串。 nan
是特殊的(在某些awk中),因为awk或它使用的底层C原语必须决定如何处理它。
当比较任何数字nan
最明智的选择是总是导致“失败”,因为没有数字可以等于(也不比小于也不更大)nan
但显然有些awk的供应商决定不这样做,作为你发现了。我个人会认为这是一个错误,但我不太了解数字理论或围绕nan
的使用标准的历史记录来说明是否是。耸肩。
如果没有--posix
标志gawk会将nan
视为字符串,但会将+nan
和-nan
视为“特殊”数值。使用--posix
gawk会将nan
视为底层C
基元决定它在您所运行的系统上。这些决定是为了支持历史计划,并且会因系统而异。
所以,尽管你觉得不--posix
GAWK现在是为你工作,因为$3==3
是假的,当输入为NaN
,它实际上不是,它在字符串NaN
只是转换为0
的数值比较。
您的问题的便携式解决方案是 - 不要这样做。如果输入的数据可以包含nan
当时的编写代码不过来处理他们,你希望他们处理,如:
$ awk '$3!="NaN" && $3==3' file
-101.358 80.775 3
但gawk --posix
会做你想做的与您现有的数据:
$ gawk '$3==3' file
-101.358 80.775 3
$ gawk --posix '$3==3' file
-101.358 80.775 3
$ echo '1 2 NaN' | gawk '$3+0==0'
1 2 NaN
$ echo '1 2 NaN' | gawk --posix '$3+0==0'
$
和WRT能够在nans
进行算术和有结果也是一个nan
在您的意见,也需要gawk --posix
与您的数据中提到:
$ gawk '{print $2 - $3}' file
77.775
78.85
80.976
81.0566
$ gawk --posix '{print $2 - $3}' file
77.775
78.85
nan
nan
所以它听起来像gawk --posix
将提供所需的所有行为,你需要从你有的数据,但要小心通常的截断规则转换字符串看起来像数字到数字适用所以如果你有一个输入字符串开始任何awk考虑了nan
那么它会得到一个数字语境中时,而不是转换为零映射到nan
:
$ echo 'nanny' | gawk '{ print $1 + 0 }'
0
$ echo '+nannny' | gawk '{ print $1 + 0 }'
nan
$ echo 'nanny' | gawk --posix '{ print $1 + 0 }'
nan
另外要注意,在POSIX模式下使用GAWK去掉所有的它是非常有用的扩展名如gensub()
所以更好的方法可能是在nan
的前面加上+
s,这样gawk就可以将它们识别为nan
•不用要求--posix
障碍和不思考你的意思nan
当你写nanny
(见上文):
$ echo 'nan' | gawk '{print ($1+0==0)}'
1
$ echo 'nan' | gawk --posix '{print ($1+0==0)}'
0
$ echo '+nan' | gawk '{print ($1+0==0)}'
0
$ echo '+nan' | gawk --posix '{print ($1+0==0)}'
0
$ echo '+nan' | gawk '{print ($1+0==0), gensub(/foo/,"bar",1)}'
0 +nan
$ echo '+nan' | gawk --posix '{print ($1+0==0), gensub(/foo/,"bar",1)}'
gawk: cmd. line:1: warning: regexp constant for parameter #1 yields boolean value
gawk: cmd. line:1: (FILENAME=- FNR=1) fatal: function `gensub' not defined
$ cat file
-101.358 80.775 3
-100.187 80.850 2
-98.019 80.976 +NaN
-96.476 81.0566 +NaN
$ gawk '{print $2 - $3}' file
77.775
78.85
nan
nan
因此,在总结 - 而gawk --posix
将与您当前的数据工作,我建议你改变你的数据使用+NaN
而不是NaN
,所以它在没有--posix
的gawk中工作,因此您可以访问许多令人难以置信的有用扩展,并且您不会意外获得以nan
开头的字符串(例如nanny
)转换为nan
。
不能在这里转载。 'awk'$ 3 == 3''给出你想要的。 – Kent
我通过在同事建议中安装gawk解决了这个问题。我相信我使用的是旧版本的awk。谢谢 – izzyrizzy
在任何情况下,'awk'$ 3 == 3'文件'是你想要的命令。其他一切都是多余的,因为打印整行是awk的默认操作。 – hek2mgl