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

1

tudo

O Awk pode lidar com colunas irregulares? ou seja, eu tenho um arquivo como abaixo, cada coluna pode ter diferentes números de valores, como obter a média de todos os valores positivos? Por favor, note que as linhas incompletas não incluem espaço em branco, então você não pode usar "sed" para substituir as que estão em branco.

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

Eu sei como obter média para arquivos regulares como abaixo, mas não vai 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, e eu preciso de uma média para todos os números diferentes de zero, não para cada coluna. Como usar o awk ou o python para fazer isso? Minha saída esperada é um número: 4.888888889 ((1 + 2 + 3 + 7 + 4 + 5 + 5 + 8 + 9) /9=4.888888889) Obrigado pela ajuda.

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
    
por kelly 30.05.2018 / 18:49

3 respostas

0

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, apenas acompanhe 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
    
por 30.05.2018 / 19:18
0

Abordagem do awk do GNU:

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
    
por 30.05.2018 / 19:31
0

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}'
    
por 30.05.2018 / 20:06

Tags