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