获取所有具有不规则列的数字的平均值

获取所有具有不规则列的数字的平均值

可以awk处理不规则的柱子吗?即我有一个如下所示的文件,其中每列可能有不同数量的值。

如何求所有正值的平均值?

请注意,不完整的行不包含空格/空格,因此您不能使用它们sed来替换这些空格。

1 2 3 7
4 5
5 0
0 8 9
0

我知道如何获得如下所示的常规文件的平均值,但如果最后一行不完整(4 个数字),它将不起作用。另外,下面的代码只能分别打印每列的平均值。

我需要所有非零数字的平均值,而不是每一列的平均值。

如何使用awkpython做到这一点?

我的预期输出是一个数字:4.888888889
((1+2+3+7+4+5+5+8+9)/9=4.888888889)

awk '{for (i=1;i <= NF; i++) if ($i>0) { sum[i] += $i; num[i]++; } } END { for(i =1;i <= NF; i++) print i, sum[i]/num[i]}' $infile

答案1

如果你想要所有列中所有数字的平均值,那么这很简单

awk '   { for (i=1;i<=NF  ;i++){ sum+=$i;num++} }
     END{ print(sum/num) } ' infile

如果您想要每列的平均值,只需跟踪最大列数:

awk '   {for (i=1;i<=NF  ;i++){ if(maxF<NF){maxF=NF};sum[i]+=$i;num[i]++} }
     END{for (i=1;i<=maxF;i++){ print(i,sum[i]/num[i]) } } ' infile

答案2

GNUawk方法:

awk -v FPAT='[1-9][0-9]*' '{ n += NF; for (i=1;i<=NF;i++) sum += $i }END{ print sum/n }' file

输出:

4.88889

答案3

我将空格转换为换行符,并且每行有一个数字:

tr ' ' '\n' <"$infile" | awk '$1 > 0 {n++; sum+=$1} END {if (n>0) print sum/n}'

相关内容