Awk - 如何使用变量作为另一个变量名称的一部分

Awk - 如何使用变量作为另一个变量名称的一部分

我有一个 awk 命令中使用的变量列表。它们是为脚本传递的参数,因此它们的值不确定,但我试图在 for 循环中使用它们。

我的问题是我可以使用变量的值作为另一个变量名称的一部分吗?或者这是一个坏主意,如果是的话,我可以采取另一条路线吗?

例子

awk -v var1=hi -v var2=howdy -v var3=greetings \
'BEGIN{for (i = 1; i <= 3; ++i) print var+i}'

所需输出

hi
howdy
greetings

答案1

我认为这在awk适当的情况下是不可能的。

然而, GNU awk ( gawk) 自版本 4.1.0(2013 年 5 月)以来有一个SYMTAB数组,其键是所有全局变量的名称,因此:

gawk -v var1=hi -v var2=howdy -v var3=greetings '
  BEGIN { for (i=1; i<=3; i++) print SYMTAB["var"i] }
'
hi
howdy
greetings

答案2

将您的值作为单个字符串传递,然后拆分该字符串并迭代其各个部分:

awk -v delim=":" -v string='hi:howdy:greetings' '
    BEGIN {
        n = split(string, a, delim)
        for (i = 1; i <= n; ++i)
            print a[i]
    }'

上面的代码将字符串与变量 一起使用,delim该变量指定字符串中使用的分隔符。这适用于任何awk.

如果您希望像这样在 shell 脚本中传递单独的变量,例如位置参数列表:

#!/bin/sh

IFS=:
awk -v delim="$IFS" -v string="$*" '
    BEGIN {
        n = split(string, a, delim)
        for (i = 1; i <= n; ++i)
            print a[i]
    }'

测试:

$ ./script.sh 1 2 3 "hello world"
1
2
3
hello world

也可以看看:

相关内容