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



我有一个文件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无关的更好方法。

最新更新