抱歉这个冗长的问题,它归结为一个非常简单的问题。
假设有 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,而第二个仅包含组 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 文件,我想输出一个 .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
任何建议将不胜感激。