在我的脚本中,我需要比较工程编号并保留高于我的阈值的工程编号。我的输入文件:
8.63384676823803E-1439,1.59426879513427E-1589,6.30982615035767E-2151,2.28965973937211E-8,7.2400080082093E-470
我的代码是:
b=5; awk -v var=$b -F "," '{a=$var; if (a >= 1E-10) {a=$var} else {a=0}; print a}' inputfile
然而,对于b = 5 (or 1/3/4)
,我得到a = 7.2400080082093E-470
,而简单比较awk 'END {if ( 7.2400080082093E-470 >= 1E-10) print "wrong"}' inputfile
似乎工作正常。
感谢您的任何提示。
答案 0 :(得分:4)
你的数字太大(或太小),以至于AWK无法理解它们。
使用GNU AWK,您可以使用任意precision integer extension,通过-M
命令行开关激活,以克服这一点。
至于与变量比较失败的具体机制。
当数字太大/太小而无法理解时,它会将其视为字符串而不是。
%b=5; awk -v var=$b -F "," '{ a=$var; print a; }' inputfile
7.2400080082093E-470
然后进行词典比较" 7.2400080082093E-470" > 1E-10产生"真"
(现在让我们强行将其转换为数字)
%b=5; awk -v var=$b -F "," '{ a=$var+0; print a; }' inputfile
0
数字比较" 0> 1E-10" yield" false",如果你手动指定一个大的整数文字就会发生同样的事情(即print 7.2400080082093E-470
- > 0
)。
启用任意精度算术:
b=5; awk -M -v var=$b -F "," '{ a=$var+0; print a; }' inputfile
7.24001e-470
答案 1 :(得分:0)
我有大数字的类似问题。从源代码构建最新的AWK为我工作。