我有一个文件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.
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
这是否可以解决您想要的事情仍然值得商bat。您很可能需要x.awk
包含以下内容:
BEGIN { file = sprintf("result/%s/%s", bld, dev); }
{ while ((getline < file) > 0) print }
尴尬不是壳,就像c不是外壳一样。您不应该期望能够访问AWK程序中的Shell变量,而不是访问C程序中的Shell变量。
要将外壳变量的值传递到尴尬脚本,请参见http://cfajohnson.com/shell/cus-faq-2.html#q24有关详细信息,但本质上是:
awk -v awkvar="$shellvar" '{ ... use awkvar ...}'
通常是正确的方法。
说,无论您尝试做什么,它看起来都是错误的方法。如果您正在考虑使用getline,请确保首先阅读http://awk.freeshell.org/allaboutgetline并了解所有警告,但是如果您告诉我们您正在尝试使用样本输入和预期的输出,我们几乎可以肯定可以帮助您提出一种与Getline无关的更好方法。