AWK除以零误差

时间:2012-02-03 05:13:58

标签: unix awk

我的awk命令出现0错误。我不确定是什么导致了这个,因为结果不应该是0.

在这种情况下,它应该是从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

2 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:2)

你的剧本说:

FNR == 22 { measC = $2 }

所以...当这个awk脚本只读了你输入文件的五行时,measC的值是多少?

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

另外,你的行:

factorC = refC / measC

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

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

你想用这个来实现什么?