2017-04-22 59 views
0

我知道,如果我有圖案的文件,我可以用如何搭配幾種模式,但每一次

grep -f pat_file search_file 

正常搜索的文件。你將如何執行這個任務,以便該命令只查找每個模式一次?

我要找的效率,所以它可能是寫一個Python程序是這樣做的最有效的方式,但我敢打賭,有什麼東西在那裏。

+2

我不認爲這是可能使用grep ......請加樣品輸入文件和預期產出 – Sundeep

回答

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語句後添加一個檢查看看是否有任何模式離開,如果沒有退出。

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 

但由於您沒有提供任何可檢驗的樣品的輸入和預期的輸出,它只是一個未經考驗的猜測。

順便說一句 - 從來不使用單詞「模式」來描述你想要什麼類型的匹配,因爲它是含糊不清,使用「串」或「正則表達式」,無論你真正的意思。