我知道,如果我有圖案的文件,我可以用如何搭配幾種模式,但每一次
grep -f pat_file search_file
正常搜索的文件。你將如何執行這個任務,以便該命令只查找每個模式一次?
我要找的效率,所以它可能是寫一個Python程序是這樣做的最有效的方式,但我敢打賭,有什麼東西在那裏。
我知道,如果我有圖案的文件,我可以用如何搭配幾種模式,但每一次
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
包含您的模式和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
語句後添加一個檢查看看是否有任何模式離開,如果沒有退出。
這可能是你在找什麼:
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
但由於您沒有提供任何可檢驗的樣品的輸入和預期的輸出,它只是一個未經考驗的猜測。
順便說一句 - 從來不使用單詞「模式」來描述你想要什麼類型的匹配,因爲它是含糊不清,使用「串」或「正則表達式」,無論你真正的意思。
我不認爲這是可能使用grep ......請加樣品輸入文件和預期產出 – Sundeep