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

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

複数のタグとその横に数字が付いたファイルがあります。例:

<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+-]+は、浮動小数点数の大まかなマッチングです (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、合計が計算されます。

関連情報