取得所有具有不規則列的數字的平均值

取得所有具有不規則列的數字的平均值

可以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}'

相關內容