为什么awk没有读取shell数组?

时间:2015-03-09 17:02:23

标签: bash awk

我在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数组的元素?

2 个答案:

答案 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