obtener el promedio de todos los números con columnas irregulares

obtener el promedio de todos los números con columnas irregulares

¿Puede awklidiar con columnas irregulares? Es decir, tengo un archivo como el siguiente, en el que cada columna puede tener un número diferente de valores.

¿Cómo obtener el promedio de todos los valores positivos?

Tenga en cuenta que las filas incompletas no incluyen espacios en blanco, por lo que no puede utilizarlos sedpara reemplazar esos espacios en blanco.

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

Sé cómo obtener el promedio de archivos normales como el siguiente, pero no funcionará si la última fila no está completa (4 números). Además, el siguiente código solo puede imprimir el promedio de cada columna por separado.

Necesito un promedio para todos los números distintos de cero, no para cada columna.

¿Cómo usar awko pythonhacer eso?

Mi resultado esperado es un 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

Respuesta1

Si desea el promedio de todos los números en todas las columnas, entonces esto es simple

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

Si desea el promedio por columna, simplemente realice un seguimiento del número máximo de columnas:

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

Respuesta2

ÑUawkacercarse:

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

La salida:

4.88889

Respuesta3

Convertiría los espacios en nuevas líneas y tendría un solo número por línea:

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

información relacionada