2017-08-31 9 views
0

ファイルに含まれるすべての警告数を調べる必要があります。 警告で始まる行には警告コードが含まれています。 私はregexpで試してみると、一言の警告を得ることができ、すべてを得ることができません。タクの下で実行するアルゴリズムを教えてください。出力の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

に動作していないこと、これまで試してみました正規表現を表示これらの行のうちの1つにマッチし、IDを抽出する正規表現?それは全体的な解決策を作るのに非常に役立ちます!それを示してください。 –

+0

'(警告\ s + \()([abc_ \ d] +)(\)で警告を分解することができます+)'すでに試した正規表現を確認すると便利です –

答えて

2

このスクリプトでは、警告コードをキャプチャするためのパターン\(([^)]+)(リテラルの左かっこからの一致、1つまたは複数の文字のキャプチャ)を使用して、周波数配列に入力します。値が与えられたキー/名前発生の頻度で

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:私は簡単に混乱しているため、貪欲でないマッチングを避ける傾向があります。 ;) –

関連する問題