在比较AWK中的工程数字时输出奇怪

时间:2017-10-24 07:19:17

标签: bash awk

在我的脚本中,我需要比较工程编号并保留高于我的阈值的工程编号。我的输入文件:

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似乎工作正常。

感谢您的任何提示。

2 个答案:

答案 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为我工作。