2010-06-26 22 views
23

¿Alguien sabe cómo puedo calcular la media de una de estas columnas (en Linux)?¿Cómo puedo calcular la media de una columna?

sda    2.91 20.44 6.13 2.95 217.53 186.67 44.55  0.84 92.97 
sda    0.00  0.00 2.00 0.00 80.00  0.00 40.00  0.22 110.00 
sda    0.00  0.00 2.00 0.00 144.00  0.00 72.00  0.71 100.00 
sda    0.00 64.00 0.00 1.00  0.00  8.00  8.00  2.63 10.00 
sda    0.00  1.84 0.31 1.38 22.09 104.29 74.91  3.39 2291.82 
sda    0.00  0.00 0.00 0.00  0.00  0.00  0.00  0.00 0.00 

Por ejemplo: media (columna 2)

+1

http://unix.stackexchange.com/questions/13731/is-there-a-way-to -get-the-min-max-median-and-average-of-a-list-of-numbers-in –

Respuesta

52

Awk:

awk '{ total += $2 } END { print total/NR }' yourFile.whatever 

Lea como:

  • Para cada línea, agregue la columna 2 a una variable 'total'.
  • Al final del archivo, imprima 'total' dividido por la cantidad de registros.
+0

... O siempre se puede utilizar AWK por supuesto :) :) +1 – OscarRyz

+0

Grandes .. gracias ... es simple y funciona muy bien !! – Alucard

+0

@Porges: ¿Cómo acceder a intervalos específicos: digamos en la segunda columna, quiero encontrar la media de los elementos 2 a 6? –

1

Puede utilizar Python para eso, está disponible en Linux.

Si esto proviene de un archivo, échale un vistazo a este question, simplemente usa flotación.

Por ejemplo:

#mean.py 
def main(): 
    with open("mean.txt", 'r') as f: 
     data = [map(float, line.split()) for line in f] 

    columnTwo = [] 
    for row in data: 
     columnTwo.append(row[1]) 

    print sum(columnTwo,0.0)/len(columnTwo) 



if __name__=="__main__": 
    main() 

imprime 14,38

acabo de incluir los datos en el archivo mean.txt, no el encabezado de la fila: "SDA"

+1

Mi primer pensamiento probablemente habría sido Python también ... pero hacer la lista podría ser demasiado ineficiente aquí, ya que solo necesitas la suma y el número de líneas. (Además, por diversión: 'con open (" mean.txt ", 'r') como f: n, t = map (sum, zip (* ((1, float (línea.split() [1])) para la línea en f))); print t/n ') –

0

David Zaslavsky para el gusto de hacerlo:

with open("mean.txt", 'r') as f: 
    n,t = map(sum, zip(*((1, float(line.split()[1])) for line in f))) 
print t/n 
0

Simple-r calculará la media con la siguiente línea:

r -k2 mean file.txt 

para la segunda columna. También puede hacer análisis estadísticos mucho más sofisticados, ya que usa R environment para todos sus análisis estadísticos. solución

3

Perl:

perl -lane '$total += $F[1]; END{print $total/$.}' file 

-a autosplits la línea en la matriz @F, que está indexada a partir de 0
$. es el número de línea

Si sus campos están separados por comas en vez de espacios en blanco:

perl -F, -lane '$total += $F[1]; END{print $total/$.}' file 

Imprimir medio valores de todas las columnas, asignan totales a array @t:

perl -lane 'for $c (0..$#F){$t[$c] += $F[$c]}; END{for $c (0..$#t){print $t[$c]/$.}}' 

salida:

0 
0.485 
14.38 
1.74 
0.888333333333333 
77.27 
49.8266666666667 
39.91 
1.29833333333333 
434.131666666667 
Cuestiones relacionadas