我知道如果我有一个模式文件,我可以使用
grep -f pat_file search_file
正常搜索文件。如何执行此任务以使命令仅查找每个模式一次?
我正在寻找效率,所以可能只是编写一个python程序是最有效的方法,但我打赌那里有一些东西。
答案 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",无论你的意思是什么。