我有一个 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
也可以看看: