
¿Puede awk
lidiar 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 sed
para 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 awk
o python
hacer 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
ÑUawk
acercarse:
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}'