我希望能够将数组变量传递给awk
。我不是指一个shell数组,而是一个原生的awk
个数组。我知道我可以传递这样的标量变量:
awk -vfoo="1" 'NR==foo' file
我可以使用相同的机制来定义awk
数组吗?类似的东西:
$ awk -v"foo[0]=1" 'NR==foo' file
awk: fatal: `foo[0]' is not a legal variable name
我已尝试过上述的一些变体,但它们都不适用于我的Debian上的GNU awk 4.1.1。那么,是否有awk
(gawk
,mawk
或其他任何版本的版本可以接受来自-v
切换的数组?
我知道我可以解决这个问题并且很容易想到这样做的方法,我只是想知道是否有任何awk
实现本身支持这种功能。
答案 0 :(得分:1)
根据定义,它似乎是不可能的。
从man awk
我们得到:
-v var = val
- 指定var = val
在执行之前,将值val赋值给变量var 程序开始了。这些变量值可用于BEGIN规则 AWK计划。
然后我们在Using Variables in a Program中读到:
变量的名称必须是字母,数字或字符序列 下划线,它可能不以数字开头。
awk中的变量可以分配数值或字符串值。
因此定义-v
实现的方式使得无法将数组作为变量提供,因为不允许对字符=
或[
进行任何使用。传递的-v
变量。两者都是必需的,因为awk
中的数组只是关联的。
答案 1 :(得分:1)
你可以使用mawk或gawk中的split()函数来分割“-v”值的输入(这里是gawk手册页):
int index = 0; AcroFields acroFields = stamper.AcroFields; TextField tf = acroFields.GetTextField(acroField.Key.ToString(), index);
将字符串s拆分为数组a,并将分隔符数组分开 正则表达式r,并返回字段数。*
这里我传递值为“ARRAYVAR”的示例,这是一个逗号分隔的值列表,它是我的数组,带有“-v”到awk程序,然后使用它将其拆分为内部变量数组“arrayval” split()函数然后打印数组的第3个值:
split(s, a [, r [, seps] ])
似乎工作:)
答案 2 :(得分:-1)
不幸的是,这是不可能的。但是,您可以使用一些巧妙的方法将 bash 数组转换为 awk 数组。
我最近想通过将一个 bash 数组传递给 awk 来使用它进行过滤来做到这一点,所以我这样做了:
$ arr=( hello world this is bash array )
$ echo -e 'this\nmight\nnot\nshow\nup' | awk 'BEGIN {
for (i = 1; i < ARGC; i++) {
my_filter[ARGV[i]]=1
ARGV[i]="" # unset ARGV[i] otherwise awk might try to read it as a file
}
} !my_filter[$0]' "${arr[@]}"
输出:
might
not
show
up