2012-02-03 94 views
1

我从我的awk命令中得到一个除错为0的错误。我不确定是什么原因造成的,因为结果不应该是0.AWK除零错误

在这种情况下,它应该从1.7229/1.5444打印1.11557887。

它是如何分配变量的问题?

这是我的脚本:

#!/usr/bin/awk -f 

FNR == 22 { measC = $2 } 
FNR == 23 { refC = $2 } 
factorC = refC/measC 
{ print factorC } 

它返回:

/usr/bin/awk: division by zero 
input record number 1, file 1.txt 
source line number 5 

这是我输入的数据是这样的:

#!xxx x 
# x x x x x x 
# x: x x 
# x: x x 
# x: x x x x x 
# (x) x x, x x x, x. 
x: x x x x 
x: 3.0.0 
x: x 
x: 0 
x: x x 
x: 0 
x: x x 
x: x 
x: 0 
x: 0 
x: 2 
x: x x x 
x: x 
x: 1 
x: 4 
origmax: 1.5444 1.5188 1.0221 1.4932 
currentmax: 1.7229 1.6888 1.1069 1.6238 

回答

5

因为你把块的factorC = refC/measC外,awk认为你想使用该表达式作为模式。所以它会评估每行输入的表达式。在第一行输入中,measC尚未定义,因此它默认为零。

我想你想要这样的:

#!/usr/bin/awk -f 

FNR == 22 { measC = $2 } 
FNR == 23 { refC = $2 } 
END { 
    factorC = refC/measC 
    print factorC 
} 

或本:

#!/usr/bin/awk -f 

FNR == 22 { measC = $2 } 
FNR == 23 { 
    refC = $2 
    factorC = refC/measC 
    print factorC 
} 
2

你的脚本说:

FNR == 22 { measC = $2 } 

所以......只有当,比方说,五线你的输入文件已被这个awk脚本读取,measC的值是多少?

我会告诉你一个秘密。它将是零。因为没有任何东西给measC分配任何东西。

而且,你行:

factorC = refC/measC 

是块之外,因此它被用于评估{ print factorC }是否应运行。并且因为它是条件,它会为每一行运行。你不知道吗,在第22行之前,measC为0.

我不理解数据或输出,所以我不知道measC应该是什么,如果有的话。

你想用这个做什么?