2017-08-31 45 views
0

我需要找出文件中包含的所有警告計數。 以Warning開頭的行包含警告代碼。 我試過用正則表達式,並能夠得到單個警告計數,無法獲得所有。請解釋算法執行以下taks。TCL - 查找文件中的所有警告計數

Warning (abc_10) .... <explanation of warning> 
Warning (abc_11) .... <explanation of warning> 
Warning (abc_10) .... <explanation of warning> 
Warning (abc_13) .... <explanation of warning> 
Warning (abc_11) .... <explanation of warning> 
Warning (abc_10) .... <explanation of warning> 
. 
. 
. 
. 
Warning (abc_15) .... <explanation of warning> 

輸出,我需要以下信息

abc_10 5 (Assuming abc_10 occurred 5 times in a file) 
abc_11 2 
abc_13 1 
abc_15 4 

請幫我進一步進行。

+0

告訴我們,你到目前爲止已經試過不工作 – neuhaus

+0

你有正則表達式一個正則表達式匹配這些行之一併提取ID?這對於制定整體解決方案非常有用!請顯示它。 –

+0

你可以用'^(Warning \ s + \()([abc_ \ d] +)(\)來分解警告。+)'這會很有用,看看你已經試過了什麼正則表達式 –

回答

2

該腳本使用模式\(([^)]+)(從字面左括號匹配,捕獲一組一個或多個字符(不包括右括號)捕獲警告代碼,然後將它們輸入到一個頻率數組中(即每個值是存在的給定的鍵/名稱的頻率

unset -nocomplain warnings 
set fp [open warning_file.txt] 
while {[gets $fp line] >= 0} { 
    if {[regexp {\(([^)]+)} $line -> key]} { 
     incr warnings($key) 
    } 
} 
close $fp 

然後,可以只打印陣列:

% parray warnings 
warnings(abc_10) = 3 
warnings(abc_11) = 2 
warnings(abc_13) = 1 
warnings(abc_15) = 1 

文檔: >= (operator)closegetsincropenparrayregexpsetunsetwhileSyntax of Tcl regular expressions

+0

我實現了這個完全一樣。我使用了非貪婪的正則表達式'^ Warning \((。+?)\)' –

+0

@glennjackman:我傾向於避免非貪婪的匹配,因爲我很容易混淆。 ;) –