Grep 如何匹配多个模式,但每个模式只匹配一次

Grep 如何匹配多个模式,但每个模式只匹配一次,grep,pattern-matching,large-files,Grep,Pattern Matching,Large Files,我知道如果我有一个我可以使用的模式文件 grep -f pat_file search_file 以正常搜索文件。如何执行此任务,使命令只查找每个模式一次 我在寻找效率,因此简单地编写python程序可能是最有效的方法,但我敢打赌一定有办法。我会在awk中这样做: FNR == NR { pattern[NR] = $0; next } { for (i in pattern) { if ($0 ~ pattern[i]) { print

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

grep -f pat_file search_file
以正常搜索文件。如何执行此任务,使命令只查找每个模式一次


我在寻找效率,因此简单地编写python程序可能是最有效的方法,但我敢打赌一定有办法。

我会在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
包含您的模式,
infle
是您要搜索的文件

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

例如,输入

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
语句后添加一个检查,查看是否有剩余的模式,如果没有,则退出。

这可能就是您要查找的:

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
但由于您没有提供任何可测试的示例输入和预期输出,所以这只是一个未经测试的猜测


顺便说一句,不要用“模式”这个词来描述你想要的匹配类型,因为它是不明确的,用“字符串”或“regexp”,无论你真正的意思是什么。

我认为这不可能用grep。。。请为文件和预期输出添加示例输入