awk getline不接受文件中的外部变量

时间:2014-02-02 16:37:03

标签: unix awk

我有一个文件test.sh,我正在执行以下awk命令。

awk -f x.awk < result/output.txt  >>difference.txt

x.awk

while (getline < result/$bld/$DeviceType)

变量DeviceType和bld在test.sh中可用。

我已将它们声明为导出类型。

export DeviceType=$line

即使这样,在执行test.sh文件时,脚本也会停在以下行

awk -f x.awk < result/output.txt  >>difference.txt

我正在

awk: x.awk:4: (FILENAME=- FNR=116) fatal: division by zero attempted
 error.

2 个答案:

答案 0 :(得分:1)

awk不是shell就像C不是shell一样。您不应期望能够访问awk程序中的shell变量,只能访问C程序中的shell变量。

要将shell变量的VALUE传递给awk脚本,请参阅http://cfajohnson.com/shell/cus-faq-2.html#Q24了解详细信息,但实质上是:

awk -v awkvar="$shellvar" '{ ... use awkvar ...}'

通常是正确的做法。

话虽如此,无论你想做什么,它看起来都是错误的做法。如果您正在考虑使用getline,请务必先阅读http://awk.freeshell.org/AllAboutGetline并了解所有注意事项,但如果您告诉我们您正在尝试使用样本输入和预期输出,我们几乎可以肯定会帮助您来采用与getline无关的更好的方法。

答案 1 :(得分:1)

awk脚本由awk读取,未被shell触及。在awk脚本中,$bld表示“变量bld中的数字指定的字段”(即awk变量bld)。

您可以在命令行上设置awk变量(正式使用-v选项):

awk -v bld="$bld" -v dev="$DeviceType" -f x.awk < result/output.txt >> difference.txt

这是否符合您的要求仍然存在争议。您很可能需要x.awk来包含以下内容:

BEGIN { file = sprintf("result/%s/%s", bld, dev); }
{ while ((getline < file) > 0) print }