为什么 awk 不读取 shell 数组?
why is awk not reading a shell array?
我在 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 数组的元素?
更改为:
for i in "${array1[@]}"; do
awk -v vars="$i" '{for(i=1; i=length(vars); ++i) print vars}' file
done
i
确实包含数组中用于 awk
的数据
awk
还需要一个文件来读取。
如果你想将一个 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
我在 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 数组的元素?
更改为:
for i in "${array1[@]}"; do
awk -v vars="$i" '{for(i=1; i=length(vars); ++i) print vars}' file
done
i
确实包含数组中用于 awk
的数据
awk
还需要一个文件来读取。
如果你想将一个 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