不規則な列を持つすべての数値の平均を取得します

不規則な列を持つすべての数値の平均を取得します

不規則な列を処理できますかawk? つまり、以下のようなファイルがあり、各列に異なる数の値が含まれる場合があります。

すべての正の値の平均を取得するにはどうすればよいでしょうか?

不完全な行には空白/スペースが含まれていないため、sedそれらの空白を置き換えるために使用することはできません。

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

以下のような通常のファイルの平均を取得する方法はわかっていますが、最終行が完全でない (4 つの数字) 場合は機能しません。さらに、以下のコードでは各列の平均を個別に印刷することしかできません。

各列ではなく、ゼロ以外のすべての数値の平均が必要です。

どのように使用したりawkpython実行したりするのですか?

予想される出力は 1 つの数値です。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

スペースを改行に変換し、1 行に 1 つの数字を表示します。

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

関連情報