在我的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"
没问题!),我得到了这种语法
错误。
答案 0 :(得分:3)
至少有两个问题,一个在shell级别,一个在awk
级别。
awk
这样的程序如果你给另一个文件读取,就不会读取标准输入。进程替换<(...)
为其提供了一个要读取的文件。要让它读取标准输入,您需要:
awk -f program <(...) - <<<"$stdout"
模式/操作语言适用于源级别。您正在尝试将其动态应用于您阅读的模式列表。您需要修改以下代码:
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
是一种优化,因此您不会多次向阵列的同一元素添加一行。