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