特定パターンの横の合計値

特定パターンの横の合計値

横に数字を含む複数のタグを含むファイルがあります。

<Overall>4
other <tags> and data
<Overall>2
other <tags> and data
<Overall>3

ファイルを検索し、タグ全体の横にあるすべての数値をどのように計算しますか?その後、この数字をタグの総数で割って全体の平均を取得します。

たとえば、上記のコードでは平均値は3です。

次に、現在のディレクトリ内のすべてのファイルを繰り返し、各ファイルの全体的な平均を一覧表示します。

答え1

awkの使用(および数字がすべての行にあると仮定)

awk 'x+=sub(/<Overall>/,""){y+=$0}END{print "AVG:",y/x}' file

xは成功したサブに増加します<Overall>。これは含まれている行でのみ増加することを意味します<Overall>

次に、次のブロックは、行の残りの数を合計に追加します。

ENDプログラムの終了時に実行されます。

最後のブロックの平均を印刷します。

編集:多くのファイルの場合

awk 'x+=sub(/<Overall>/,""){y+=$0}END{print FILENAME,"AVG:",y/x}' LISTOFFILES

答え2

そしてperl

perl -lne 'for (/<Overall>([\d.eE+-]+)/g) {$n++; $sum += $1}
           END{print $sum/$n if $n}'

<Overall>これの利点は、1行に複数のタグを処理できることです。[\d.eE+-]+浮動小数点10進数のおおよそのマッチングです(12、1.2、-1E + 20(有効な数字ではありませんが)のようなものを許可します)。

答え3

awkのおおよそのアプローチは次のとおりです。

awk '/^<Overall>/ { 
    sub("<Overall>", ""); 
    sum += $1; 
    lines++; 
  } 
  END { print sum / lines}' 
  tags  ### this is your input file

答え4

以下は素晴らしいユーティリティを使用するソリューションです。

grep "^<Overall>\d\+" file | cut -c 10 | paste -s -d + - | bc
  1. ファイル内の「<Overkill>」で始まり、後に数字文字列(数字など)が続く行を検索します。
  2. 行の残りの部分から数字を切り取ります。
  3. すべての線を「+」記号で連結する
  4. 結果を渡すと、bc合計が計算されます。

関連情報