首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用循环在两个模式之间执行awk

使用循环在两个模式之间执行awk
EN

Stack Overflow用户
提问于 2016-03-03 07:13:35
回答 1查看 446关注 0票数 2

我有一个大型数据库(database.csv),其中包含以下格式的条目:

代码语言:javascript
复制
SOME_ID_NUMBER
Some delimited columns of data here
More delimited columns of data here
Tonsof delimited columns of data here
#########
SOME_ID_NUMBER_2
Other delimited columns of data here
Cool delimited columns of data here
Awesome delimited columns of data here
Extra delimited columns of data here
#########
OTHER_ID_NAMES
Lame delimited columns of data here
Boring delimited columns of data here
Okay delimited columns of data here
#########

这些条目以条目名开头,然后是几行(不同数量)的分隔数据,最后以一行'#‘字符结束

我在另一个文件(patterns.csv)中也有一个很大的模式列表,其中包含如下条目:

代码语言:javascript
复制
Some_ID_NUMBER
OTHER_ID_NAMES
ID_NOT_IN_LIST

我想从数据库文件中提取与模式文件中的模式匹配的条目。以下是使用上面的数据所需的示例输出。

代码语言:javascript
复制
SOME_ID_NUMBER
Some delimited columns of data here
More delimited columns of data here
Tonsof delimited columns of data here
#########
OTHER_ID_NAMES
Lame delimited columns of data here
Boring delimited columns of data here
Okay delimited columns of data here
#########

或者更好的输出:

代码语言:javascript
复制
SOME_ID_NUMBER Some delimited columns of data here
SOME_ID_NUMBER More delimited columns of data here
SOME_ID_NUMBER Tonsof delimited columns of data here
OTHER_ID_NAMES Lame delimited columns of data here
OTHER_ID_NAMES Boring delimited columns of data here
OTHER_ID_NAMES Okay delimited columns of data here
ID_NOT_IN_LIST

这是我的尝试:

代码语言:javascript
复制
while read line
do
awk -v start="$line" -v last="#" '/^"start"/,/^"last"/' database.csv >>matches.csv
done<patterns.csv
EN

回答 1

Stack Overflow用户

发布于 2016-03-03 07:27:20

使用多字符RS和ENDFILE的GNU awk:

代码语言:javascript
复制
$ cat tst.awk
NR==FNR { patterns[toupper($0)]; next }
ENDFILE { RS=ORS="\n#########\n"; FS="\n" }
toupper($1) in patterns

$ gawk -f tst.awk patterns.csv database.csv
SOME_ID_NUMBER
Some delimited columns of data here
More delimited columns of data here
Tonsof delimited columns of data here
#########
OTHER_ID_NAMES
Lame delimited columns of data here
Boring delimited columns of data here
Okay delimited columns of data here
#########

代码语言:javascript
复制
$ cat tst.awk
NR==FNR { patterns[toupper($0)]; next }
ENDFILE { RS="\n#########\n"; FS="\n" }
toupper($1) in patterns {
    patterns[$1]++
    for (i=2;i<=NF;i++) {
        print $1, $i
    }
}
END {
    for (pat in patterns) {
        if (patterns[pat] == 0) {
            print pat
        }
    }
}

$ gawk -f tst.awk patterns.csv database.csv
SOME_ID_NUMBER Some delimited columns of data here
SOME_ID_NUMBER More delimited columns of data here
SOME_ID_NUMBER Tonsof delimited columns of data here
OTHER_ID_NAMES Lame delimited columns of data here
OTHER_ID_NAMES Boring delimited columns of data here
OTHER_ID_NAMES Okay delimited columns of data here
ID_NOT_IN_LIST

如果你想再次编写一个外壳循环仅仅是为了操作文本,也可以参见https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice

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

https://stackoverflow.com/questions/35760108

复制
相关文章

相似问题

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