冗長な質問で申し訳ありませんが、それは非常に単純な問題に要約されます。
文字列の1つの列(グループを表す)と整数の1つ(これらのグループ内のインスタンスの値を表す)をそれぞれ含むn個のテキストファイルがあると仮定します。
# filename xxyz.log
a 5
a 6
b 10
b 15
c 101
c 100
#filename xyzz.log
a 3
a 5
c 116
c 128
特定のファイル内の両方の列の長さは常に同じですが、ファイル間で異なることに注意してください。さらに、すべてのファイルに同じ範囲のグループが含まれているわけではありません(最初のファイルにはグループa、b、cが含まれ、2番目のファイルにはグループaとcのみが含まれます)。awkでは、各ファイル内の列1の各文字列の列2の平均を個別に計算し、次のコードで結果を出力できます。
NAMES=$(ls|grep .log|awk -F'.' '{print $1}');
for q in $NAMES;
do
gawk -F' ' -v y=$q 'BEGIN {print "param", y}
{sum1[$1] += $2; N[$1]++}
END {for (key in sum1) {
avg1 = sum1[key] / N[key];
printf "%s %f\n", key, avg1;
} }' $q.log | sort > $q.mean;
done;
ただし、上記の理由により、結果の.meanファイルの長さはファイル間で異なります。.logファイルごとに、最初の列にグループ(ad)の全範囲をリストし、2番目の列に対応する平均値または空のスペースをリストする.meanファイルを出力します。これは、このカテゴリがに存在するかどうかによって異なります。ログファイル。私は次のコードを試しました(簡潔にするために$ NAMESなしで与えられています):
awk 'BEGIN{arr[a]="a"; arr[b]="b"; arr[c]="c"; arr[d]="d"}
{sum[$1] += $2; N[$1]++}
END {for (i in arr) {
if (i in sum) {
avg = sum[i] / N[i];
printf "%s %f\n" i, avg;}
else {
printf "%s %s\n" i, "";}
}}' xxyz.log > xxyz.mean;
ただし、次のエラーが返されます。
awk: (FILENAME=myfile FNR=7) fatal: not enough arguments to satisfy format string
`%s %s
'
^ ran out for this one
任意の提案をいただければ幸いです。