在awk中使用数组变量?

Dag*_*ang 8 bash awk

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

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

gee*_*aur 9

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

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

由于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
Run Code Online (Sandbox Code Playgroud)

(澄清: 调用你正在替换它的参数的程序之前bash替换变量,所以当你进入它的时候为时已晚,要求用它来代替特定的元素.)$1awkbashA

  • AWK将接受一个文件名作为参数,而不需要使用`<`重定向它,如kurumi指出的那样.虽然'awk'{...}'A = foo文件名将起作用,但你有'awk A = foo'{...}'filename`的形式不会.但是,您可以执行`awk -v"A = foo"'{...}'filename`. (3认同)

kur*_*umi 4

如果要对数组进行硬编码A,则可以在中初始化它awk

awk 'BEGIN{A[0]="aaa";A[1]="bbb"}{ print $1, A[$1] }' abc.txt
Run Code Online (Sandbox Code Playgroud)