我可以使用-v将数组传递给awk吗?

时间:2015-10-13 14:49:38

标签: arrays awk gawk mawk

我希望能够将数组变量传递给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。那么,是否有awkgawkmawk或其他任何版本的版本可以接受来自-v切换的数组?

我知道我可以解决这个问题并且很容易想到这样做的方法,我只是想知道是否有任何awk实现本身支持这种功能。

3 个答案:

答案 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