如何匹配几个模式,但每个只有一次

时间:2017-04-22 01:46:13

标签: grep pattern-matching large-files

我知道如果我有一个模式文件,我可以使用

grep -f pat_file search_file

正常搜索文件。如何执行此任务以使命令仅查找每个模式一次?

我正在寻找效率,所以可能只是编写一个python程序是最有效的方法,但我打赌那里有一些东西。

2 个答案:

答案 0 :(得分:0)

我会在awk中这样做:

FNR == NR { pattern[NR] = $0; next }

{
    for (i in pattern) {
        if ($0 ~ pattern[i]) {
            print
            delete pattern[i]
            continue
        }
    }
}

如下调用:

awk -f script.awk patterns infile

其中patterns包含您的模式,infile是您要搜索的文件。

第一个命令将模式读入数组;第二个命令(仅对第一个文件后的文件执行)循环遍历模式,打印匹配的行,从数组中删除模式并跳过其余模式。

输入

的示例
line with pattern1
another line with pattern1
line with pattern2
pattern1 again
pattern3 now
and pattern2

和模式文件

pattern1
pattern2
pattern3

输出

$ awk -f script.awk patterns infile
line with pattern1
line with pattern2
pattern3 now

要进行优化,您可以在delete语句后添加一个检查,以查看是否有任何模式,如果没有则退出。

答案 1 :(得分:0)

这可能是你正在寻找的东西:

awk '
NR==FNR { regexps[$0]; next }
{
    found = 0
    for (regexp in regexps) {
        if ($0 ~ regexp) {
            found = 1
            delete regexps[regexp]
        }
    }
}
found
' pat_file search_file

但是由于您还没有提供任何可测试的样本输入和预期输出,这只是一个未经测试的猜测。

顺便说一句 - 永远不要使用" pattern"描述你想要什么类型的匹配,因为它不明确,使用"字符串"或者" regexp",无论你的意思是什么。