【问题标题】:awk getline not accepting external variable from a fileawk getline 不接受来自文件的外部变量
【发布时间】:2014-02-02 16:37:02
【问题描述】:

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

【问题讨论】:

  • 什么是 result/output.txt ?它包含什么数据?在应用/操作之前先检查这两个数据。
  • 我认为数据没有问题。因为,如果我像 while (getline

标签: unix awk


【解决方案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 }

【讨论】:

  • 该脚本在尝试在不可读或不存在的文件上运行时可能会进入无限循环,因为 getline 在 [某些] 错误上返回 -1。如果您正在考虑使用 getline,请务必阅读 awk.info/?tip/getline 并完全理解所有注意事项、适当的用法和相对安全的语法。
  • @EdMorton:你说得对——我正在处理问题的其他方面,而不是getline 测试的细节——这只是一个借口。
  • awk.freeshell.org/AllAboutGetline 代替 awk.info。
【解决方案2】:

awk 不是外壳,就像 C 不是外壳一样。您不应该期望能够访问 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 无关。

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 2020-06-02
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 2021-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多