可以awk
处理不规则的柱子吗?即我有一个如下所示的文件,其中每列可能有不同数量的值。
如何求所有正值的平均值?
请注意,不完整的行不包含空格/空格,因此您不能使用它们sed
来替换这些空格。
1 2 3 7
4 5
5 0
0 8 9
0
我知道如何获得如下所示的常规文件的平均值,但如果最后一行不完整(4 个数字),它将不起作用。另外,下面的代码只能分别打印每列的平均值。
我需要所有非零数字的平均值,而不是每一列的平均值。
如何使用awk
或python
做到这一点?
我的预期输出是一个数字: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}'