obter média para todos os números com colunas irregulares

obter média para todos os números com colunas irregulares

Pode awklidar com colunas irregulares? Ou seja, tenho um arquivo como o abaixo, em que cada coluna pode ter um número diferente de valores.

Como obter a média de todos os valores positivos?

Observe que as linhas incompletas não incluem espaços em branco/espaço, portanto você não pode usar sedpara substituir esses espaços em branco.

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

Eu sei como obter a média para arquivos regulares como abaixo, mas não funcionará se a linha final não estiver completa (4 números). Além disso, o código abaixo só pode imprimir a média de cada coluna separadamente.

Preciso de uma média para todos os números diferentes de zero, não para cada coluna.

Como usar awkou pythonfazer isso?

Minha saída esperada é um número: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

Responder1

Se você quiser a média de todos os números em todas as colunas, isso é simples

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

Se você quiser a média por coluna, basta acompanhar o número máximo de colunas:

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

Responder2

GNUawkabordagem:

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

A saída:

4.88889

Responder3

Eu converteria os espaços em novas linhas e teria um único número por linha:

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

informação relacionada