在我的bash脚本中:
patterns=( "somee? +pattern" "Another +here" )
awk -v l="$line" -f horsepower <(printf '%s\n' "${patterns[@]}") <<<"$stdout",因此向awk脚本发送两个文件,第一个是printf在${patterns[@]}数组上的进程替换输出,另一个是来自$stdout变量的HERESTRING提要。
,然后在这个外部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是否使用<()和<<<"$stdout"的方法从bash脚本获得正确的第二个文件?
我必须指出,当我在awk脚本中使用文字正则表达式时,所有这些都是有效的,但是当我介绍那个for (pat in patterns),并在bash中添加<() (<<<"$stdout"很好!)时,我得到了这个语法错误。
发布于 2014-07-10 23:25:20
至少有两个问题,一个在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是一个优化,因此不会多次向数组的同一元素添加一行。
https://stackoverflow.com/questions/24687607
复制相似问题