在awk中使用数组变量?

时间:2011-03-23 02:34:19

标签: bash awk

A=(aaa bbb ccc)    
cat abc.txt | awk '{ print $1, ${A[$1]} }'

我想基于$ 1索引一个数组元素,但上面的代码在awk语法中是不正确的。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:9)

即使您没有使用单引号(从而阻止bash进行任何替换),也无法使用awk内生成的值索引bash数组。但是你可以传入数组。

A=(aaa bbb ccc)
awk -v a="${A[*]}" 'BEGIN {split(a, A, / /)}
                     {print $1, A[$1] }' <abc.txt

由于awk中的split函数,A的元素可能不包含空格或换行符。如果您需要做更有趣的事情,请在awk内设置数组。

awk 'BEGIN {a[1] = "foo bar"  # sadly, there is no way to set an array all
            a[2] = "baz"    } #   at once without abusing split() as above
           {print $1, a[$1] }' <abc.txt

(澄清:bash在之前用变量替换你正在替换你的参数的程序,所以当你在$1 awk时它已远要求bash使用它替换A的特定元素,为时已晚。)

答案 1 :(得分:4)

如果您要对A数组进行硬编码,则可以在awk

中对其进行初始化
awk 'BEGIN{A[0]="aaa";A[1]="bbb"}{ print $1, A[$1] }' abc.txt

答案 2 :(得分:2)

单引号中的awk程序无法看到shell环境变量A.一般情况下,如果使用双引号而不是单引号,可以使用一些shell替换,但这是由shell完成的,在awk之前是调用。总的来说,尝试以这种方式组合shell和awk是沉重的雪橇。如果可能的话,我会采用kurumi的方法来使用awk数组。

单引号:难以捉摸的面纱。 双引号:一般过于劳累。 所以选择你的毒药:shell或awk。 否则:您的代码可能会犹豫不决。

答案 3 :(得分:1)

您还可以使用printf在单独的行上打印数组的每个元素,并将其传递给awk。这段代码只是从awk:

打印bash数组(bash_arr)
bash_arr=( 1 2 3 4 5 )
printf '%s\n' "${bash_arr[@]}" | 
    awk '    { awk_arr[NR] = $0 }
         END {
             for (key in awk_arr) {
                 print awk_arr[key]
             }
         }'