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。。。请为文件和预期输出添加示例输入