A=(aaa bbb ccc)
cat abc.txt | awk '{ print $1, ${A[$1]} }'
我想基于$ 1索引一个数组元素,但上面的代码在awk语法中是不正确的。有人可以帮忙吗?
答案 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]
}
}'