首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用外部awk脚本从bash发送的遍历数组

用外部awk脚本从bash发送的遍历数组
EN

Stack Overflow用户
提问于 2014-07-10 22:53:32
回答 1查看 156关注 0票数 0

在我的bash脚本中:

代码语言:javascript
复制
patterns=( "somee? +pattern" "Another +here" )

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

,因此向awk脚本发送两个文件,第一个是printf${patterns[@]}数组上的进程替换输出,另一个是来自$stdout变量的HERESTRING提要。

,然后在这个外部awk脚本(在这里命名为horsepower )中,我有以下内容:

代码语言:javascript
复制
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"很好!)时,我得到了这个语法错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-10 23:25:20

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

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

代码语言:javascript
复制
awk -f program <(...) - <<<"$stdout"

Awk

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

代码语言:javascript
复制
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 }

所以它更像是:

代码语言:javascript
复制
{
    for (pat in patterns)
        if ($0 ~ pat) { a_rem[NR]=$0; break }
}

添加的break是一个优化,因此不会多次向数组的同一元素添加一行。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24687607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档