在外部awk脚本中从bash发送的遍历数组

时间:2014-07-10 22:53:33

标签: arrays bash awk

在我的bash脚本中,我有:

patterns=( "somee? +pattern" "Another +here" )

awk -v l="$line" -f horsepower <(printf '%s\n' "${patterns[@]}") <<<"$stdout"

,所以向awk脚本发送两个文件,首先是进程替换输出 printf数组${patterns[@]},第二个 HERESTRING 来自。{ $stdout变量。

,然后在那个名为awk的外部horsepower脚本中,我有 以下内容:

BEGIN {
    ...some initialization, not of importance for this question
}


# while reading first file, populate `patterns` array in awk
FNR==NR { patterns[$0]=""; next }

for (pat in patterns)
    # match lines from `$stdout` on patterns sent from bash, and save them in `a_rem`
    # array, for later output in END block.
    $0 ~ pat { a_rem[NR]=$0 }

# then follows END block
END {
    ...also non important
}

,但我从for上方for (pat in patterns)注意到语法错误。

我做错了什么?此外,awk获取正确的第一个,第二个文件来自 我的bash脚本,使用<()<<<"$stdout"的方法?

我不得不提一下,当我使用文字正则表达式时,所有这一切都在起作用 awk脚本,但是我介绍for (pat in patterns)的那一刻,和 在bash中添加<()<<<"$stdout"没问题!),我得到了这种语法 错误。

1 个答案:

答案 0 :(得分:3)

至少有两个问题,一个在shell级别,一个在awk级别。

贝壳

awk这样的程序如果你给另一个文件读取,就不会读取标准输入。进程替换<(...)为其提供了一个要读取的文件。要让它读取标准输入,您需要:

awk -f program <(...) - <<<"$stdout"

awk中

模式/操作语言适用于源级别。您正在尝试将其动态应用于您阅读的模式列表。您需要修改以下代码:

for (pat in patterns)
    # match lines  on patterns sent from bash, and save them in `a_rem`
    # array, for later output in END block.
    $0 ~ pat { a_rem[NR]=$0 }

因此更像是:

{
    for (pat in patterns)
        if ($0 ~ pat) { a_rem[NR]=$0; break }
}

添加的break是一种优化,因此您不会多次向阵列的同一元素添加一行。