gpt4 book ai didi

awk - 如何在代码中扩展 awk 变量?

转载 作者:行者123 更新时间:2023-12-02 00:49:12 24 4
gpt4 key购买 nike

假设我将一些变量传递给 awk 脚本:

$AWK -f script.awk -v var01="foo" var02="bar"

在脚本中我获得了一些模式:

# pattern01 var01
/pattern01/ {
if (??? == "foo") print
}

我想将变量“$2”(“var01”)扩展到它的给定值。我一直在尝试使用 gawk,它似乎能够通过以下方式扩展变量:

print $$x

但是,出于某种原因,这在第一个示例中不起作用,而且我需要保持 POSIX 兼容性。是否可以扩展给定示例中的变量?(注意:我特别想要这种行为(如果可能的话),所以我不想使用其他工具或 shell 扩展来解决问题)

shell 中的等价物:

file01:
foobar
some random text
pattern01 var01
more random text...

code.sh:
#!/bin/sh
var01="Hello"
x="$(grep '^pattern01' file01 | awk '{print $2}')"
eval echo "$"$x # prints Hello

最佳答案

使用 POSIX awk,无法通过名称查找变量的值。而是考虑使用数组来存储值。不是最优雅的,但便携:

$AWK -e 'BEGIN { v["var01"] = "foo"; v["var02"] = "bar"}' -f script.awk

脚本.awk

# pattern01 var01
/pattern01/ {
if ( v[$2] == "foo") print
}

如果您知道您将使用新的 GNU AWK 版本,并且可以使用扩展,则可以使用 SYMTAB 数组。来自手册页:

SYMTAB An array whose indices are the names of all currently defined global variables and arrays in the program. The array may be used for indirect access to read or write the value of a variable:

  foo = 5
SYMTAB["foo"] = 4
print foo # prints 4
$AWK -f script.awk -v var01="foo" var02="bar"

script.awk
# pattern01 var01
/pattern01/ {
if ( SYMTAB[$2] == "foo") print
}

这两种方法都消除了创建环境变量的需要,这可能会对其他程序产生影响,并且可能难以扩展。

关于awk - 如何在代码中扩展 awk 变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59061802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com