ter*_*don 7 arrays awk gawk mawk
我希望能够将数组变量传递给awk. 我指的不是 shell 数组,而是本机数组awk。我知道我可以像这样传递标量变量:
awk -vfoo="1" 'NR==foo' file
Run Code Online (Sandbox Code Playgroud)
我可以使用相同的机制来定义awk数组吗?就像是:
$ awk -v"foo[0]=1" 'NR==foo' file
awk: fatal: `foo[0]' is not a legal variable name
Run Code Online (Sandbox Code Playgroud)
我已经尝试了上述几种变体,但它们都不适用于我的 Debian 上的 GNU awk 4.1.1。那么,有没有任何版本awk(gawk,mawk或其他任何东西),可以接受来自一个数组-v开关?
我知道我可以解决这个问题并且可以很容易地想到这样做的方法,我只是想知道是否有任何awk实现本身支持这种功能。
小智 7
您可以使用 mawk 或 gawk 中的 split() 函数来拆分“-v”值的输入(这里是 gawk 手册页):
split(s, a [, r [, seps] ])将字符串 s 拆分为数组 a 和正则表达式 r 上的分隔符数组 seps,并返回字段数。*
这里的一个例子,我将值“ARRAYVAR”(一个逗号分隔的值列表,这是我的数组)与“-v”一起传递给 awk 程序,然后使用 split() 将其拆分为内部变量数组“arrayval”函数,然后打印数组的第三个值:
echo 0 | gawk -v ARRAYVAR="a,b,c,d,e,f" '{ split(ARRAYVAR,arrayval,","); print(arrayval[3]) }'
c
Run Code Online (Sandbox Code Playgroud)
似乎有效:)
从定义上看,这似乎是不可能的。
从man awk我们得知:
-v var=val
--分配变量=值
在程序开始执行之前,将值 val 赋给变量 var。此类变量值可用于 AWK 程序的 BEGIN 规则。
然后我们在程序中使用变量中读到:
变量的名称必须是字母、数字或下划线的序列,并且不能以数字开头。
awk 中的变量可以指定为数字值或字符串值。
因此,定义实现的方式-v使得不可能提供数组作为变量,因为任何类型的字符=或字符的使用[都不允许作为-v变量传递的一部分。两者都是必需的,因为 in 中的数组awk只是关联的。