gawk
根据使用的阈值不同地过滤出非常小的正数,但是所有阈值都应保留该条目。
示例输入文件tmp
:
A 3.92e-373
B 5e-300
C 5e-20
D 5e-6
E 5e-3
输出:
% gawk '$2 < 5e-4' tmp
B 5e-300
C 5e-20
D 5e-6
% gawk '$2 < 5e-8' tmp
A 3.92e-373
D 5e-300
C 5e-20
注意gawk '$2 < 5e-4'
应该保留条目$2 < 3.92e-373
,这对gawk '$2 < 5e-8'
有用。
很明显,这是浮点数限制的问题,但是我发现两个阈值的结果不一致是很奇怪的。 gawk
不应该简单地将3.92e-373
限制为0
并在所有情况下都打印此行吗?
答案 0 :(得分:2)
我不认为gawk可以根据输入和硬编码值来判断数字和字符串是什么。通过在它们上使用strtonum()
,确保将它们视为数字:
$ gawk 'strtonum($2) < strtonum("5e-4")' file
A 3.92e-373
B 5e-300
C 5e-20
D 5e-6
$ gawk 'strtonum($2) < strtonum("5e-8")' file
A 3.92e-373
B 5e-300
C 5e-20
您可以通过在每个类型上调用typeof()来查看gawk认为要处理的类型:
$ gawk '{print typeof($2), $2, typeof(5e-4), 5e-4, strtonum($2), strtonum("5e-4")}' file | column -t
string 3.92e-373 number 0.0005 0 0.0005
strnum 5e-300 number 0.0005 5e-300 0.0005
strnum 5e-20 number 0.0005 5e-20 0.0005
strnum 5e-6 number 0.0005 5e-06 0.0005
strnum 5e-3 number 0.0005 0.005 0.0005
所以看来strtonum("5e-4")
是多余的,但是恕我直言,它提高了清晰度,所以我会保留它。
请注意,gawk不会自动将3.92e-373
识别为数字,因此该输入的比较将是字符串与数字的比较,并作为字符串比较完成(请参见https://www.gnu.org/software/gawk/manual/gawk.html#Typing-and-Comparison上的表)。