我有一个文件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.
答案 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 }