2010-06-26 18 views
23

Wer weiß, wie kann ich den Mittelwert von einer dieser Spalten (auf Linux) berechnen?Wie berechne ich den Mittelwert einer Spalte

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 

Zum Beispiel: Mittelwert (Spalte 2)

+1

http://unix.stackexchange.com/questions/13731/is-there-a-way-to -get-the-min-max-Median-und-Durchschnitt einer Liste von Zahlen in –

Antwort

52

Awk:

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

Lesen als:

  • Fügen Sie für jede Zeile Spalte 2 zu einer Variablen "total" hinzu.
  • Am Ende der Datei, drucken 'Gesamt' geteilt durch die Anzahl der Datensätze.
+0

... Oder du kannst AWK natürlich immer benutzen :) :) +1 – OscarRyz

+0

Großartig ... danke ... es ist einfach und funktioniert wirklich gut !! – Alucard

+0

@Porges: Wie man auf bestimmte Intervalle zugreift: Sagen wir in der zweiten Spalte, ich möchte den Mittelwert der Elemente 2 bis 6 finden? –

1

Sie Python dafür verwenden können, ist unter Linux zur Verfügung.

Wenn das von einer Datei kommt, werfen Sie einen Blick auf diese question, verwenden Sie stattdessen float.

Zum Beispiel:

#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() 

Drucke 14,38

I sind nur die Daten in der Datei mean.txt, nicht die Zeilenkopf: "sda"

+1

Mein erster Gedanke wäre wahrscheinlich auch Python gewesen ... aber die Liste könnte hier zu ineffizient sein, Da brauchst du nur die Summe und die Anzahl der Zeilen. (Außerdem zum Spaß: 'mit open (" mean.txt ", 'r') als f: n, t = map (Summe, zip (* ((1, float (line.split() [1])) für Zeile in f))); print t/n') –

0

David Zaslavsky für den Spaß von ihm:

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 wird der Mittelwert mit der folgenden Zeile berechnen:

r -k2 mean file.txt 

für die zweite Spalte. Es kann auch viel kompliziertere statistische Analysen durchführen, da es R environment für alle seine statistischen Analysen verwendet.

3

Perl Lösung:

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

-a autosplits der Leitung in die @F Array, das
$. beginnend bei 0 indexiert ist die Zeilennummer

Wenn die Felder, die durch Kommata getrennt sind anstelle Whitespace:

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

Um zu drucken, bedeuten Werte aller Spalten zuweisen Summen Array @t:

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

output:

0 
0.485 
14.38 
1.74 
0.888333333333333 
77.27 
49.8266666666667 
39.91 
1.29833333333333 
434.131666666667 
Verwandte Themen