Grep
grep 用於多個正則表達式,併計算出現次數
說,我有一個文件,必須在其中搜尋多個正則表達式,並且必須計算每個正則表達式的匹配數。
因此,我無法組合模式:
grep -Po '{regex_1}|{regex_2}|...|{regex_n}' file | wc -l
…因為需要每個正則表達式的出現次數。
我顯然可以:
occurences[i]=$(grep -Po "${regex[i]}" file | wc -l)
…但不幸的是,遇到的文件可能非常大(> 1 GB)並且有許多模式(在數千個範圍內)要檢查,這使得該過程非常緩慢,因為對同一個文件的多次讀取會涉及。
有沒有辦法快速做到這一點?
可能
awk
是這裡最快的 shell 工具。你可以試試:awk "/$regex1/ { ++r1 } /$regex2/ { ++r2 }"' END { print "regex1:",r1 "\nregex2:",r2 }' <infile
當然,如果您需要
perl
像您的問題一樣使用正則表達式,那麼真的perl
是唯一的答案。但是,awk
確實使用擴展表達式(如grep -E
)而不是基本表達式。
我能想到的最快的解決方案是flex。以下是未經測試的骨架:
%{ int count[1000]; %} %% regex0 {count[0]++; } regex1 {count[1]++; } ... .|\n {} %% int main(){ yylex(); // printf the counts; }
flex 在優化自動機和生成快速 C 程式碼方面做得很好。
如果正則表達式更改,您必須重新編譯它…
編輯:如果您實施並嘗試任何解決方案,那麼看看時代將會很有趣。