Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在AWK中比较工程数字时出现奇怪的输出_Bash_Awk - Fatal编程技术网

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

Bash 在AWK中比较工程数字时出现奇怪的输出,bash,awk,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}' inputfi

在我的脚本中,我需要比较工程数字,并保持那些高于我阈值的数字。我的输入文件:

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(或1/3/4)
我得到
a=7.240008082093e-470
,而简单的比较
awk'END{if(7.240008082093e-470>=1E-10)打印“错误”}输入文件
似乎工作正常


谢谢您的提示。

您的数字太大(或太小),AWK无法理解

有了GNU AWK,您可以使用一个任意的命令行开关来克服这个问题,该开关通过
-M
命令行开关激活

关于为什么与变量比较失败的具体机制

当它得到一个太大/太小而无法理解的数字时,它会将其视为字符串

%b=5; awk -v var=$b -F "," '{ a=$var; print a; }' inputfile 
7.2400080082093E-470
然后对“7.240008082093E-470”>1E-10进行词典学比较,得出“正确”

(现在我们强制将其转换为数字)

数值比较“0>1E-10”产生“false”,如果手动指定大整数文字(即
print 7.240008082093E-470
-->
0
),则会发生相同的情况

启用任意精度算术后:

b=5; awk -M -v var=$b -F "," '{ a=$var+0; print a; }' inputfile 
7.24001e-470

我对大数字也有类似的问题。从资料来源构建最新的AWK对我来说很有用

齐柏林飞艇,谢谢你的回答!这对我很有用。然而,我仍然不明白为什么只有当数字被包装成一个变量时才会出现问题,因为如果你比较这些普通数字,它工作得很好(
awk'END{if(7.240008082093e-470>=1E-10){print“error”}否则{print right}}inputfile
会给你“right”)@MirrG当你使用普通数字文字时,它只是转换为
0
,在进行比较之前,这就是它看起来有效的原因,请尝试:
awk'BEGIN{print 7.240008082093e-470}
,使用和不使用
-M
开关。
b=5; awk -M -v var=$b -F "," '{ a=$var+0; print a; }' inputfile 
7.24001e-470