【问题标题】:How to match several patterns, but each only once如何匹配多个模式,但每个模式只匹配一次
【发布时间】:2017-04-22 01:46:13
【问题描述】:

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

grep -f pat_file search_file

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

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

【问题讨论】:

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

标签: grep pattern-matching large-files


【解决方案1】:

我会在 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 语句之后添加一个检查,以查看是否还有任何模式,如果没有则退出。

【讨论】:

    【解决方案2】:

    这可能是您正在寻找的:

    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
    

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

    顺便说一句 - 永远不要使用“模式”这个词来描述你想要的匹配类型,因为它是模棱两可的,使用“字符串”或“正则表达式”,无论你是什么意思。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-04
      相关资源
      最近更新 更多