横に数字を含む複数のタグを含むファイルがあります。
<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
- ファイル内の「<Overkill>」で始まり、後に数字文字列(数字など)が続く行を検索します。
- 行の残りの部分から数字を切り取ります。
- すべての線を「+」記号で連結する
- 結果を渡すと、
bc
合計が計算されます。