我在awk中使用-v选项来读取shell数组。但是,它似乎没有起作用:
#!/bin/bash
array1=(1 2)
for i in "${array1[@]}"; do
awk -v vars=${array1[*]} '{for(i=1; i=length(vars); ++i) print vars}'
done
$ ./program
awk: cmd. line:1: fatal: cannot open file `{for(i=1; i=length(vars); ++i) print vars}' for reading (No such file or directory)
awk: cmd. line:1: fatal: cannot open file `{for(i=1; i=length(vars); ++i) print vars}' for reading (No such file or directory)
为什么awk似乎试图读取文件,而不是shell数组的元素?
答案 0 :(得分:3)
更改为:
for i in "${array1[@]}"; do
awk -v vars="$i" '{for(i=1; i=length(vars); ++i) print vars}' file
done
i
确实包含数组中用于awk
的数据
awk
还需要一个文件来阅读。
答案 1 :(得分:2)
如果要将bash变量传递给awk并将其视为awk 数组,则必须将bash变量字符串化并将其拆分为awk:
array1=(foo bar baz "hello world")
(
IFS=:
awk -v str="${array1[*]}" -v sep="[$IFS]" '
BEGIN {
n = split(str, a, sep)
for (i=1; i<=n; ++i) print i, a[i]
}
'
)
(使用括号在子shell中本地化IFS的更改)这个 输出
1 foo
2 bar
3 baz
4 hello world