2016-04-11 11 views
0

Meine Dateien sieht wie folgt aus:berechnen durchschnittlich 1 kb Fenster

18 1600014 + CAA 0 3 
18 1600017 - CTT 0 1 
18 1600019 - CTC 0 1 
18 1600020 + CAT 0 3 
18 1600031 - CAA 0 1 
18 1600035 - CAT 0 1 
... 

Ich versuche, die durchschnittlich Spalte 6 in den Fenstern zu berechnen, die 1000 Bereich der Säulenabdeckung 2. So 1.600.001-1.601.000, 1601001- 1602000 usw. Meine Werte gehen von 1600000-1700000. Gibt es einen Weg, dies zu tun, ist ein Schritt? Mein erster Gedanke war, diese Werte mit grep zu sortieren, aber das würde viele verschiedene Befehle erfordern. Ich bin mir bewusst, dass Sie den Durchschnitt mit awk berechnen können, aber können Sie über jedes Fenster wiederholen?

Wunsch Ausgabe etwas so sein würde:

1600001-1601000 3.215 
1601001-1602000 3.141 
1602001-1603000 3.542 

Antwort

1

Sie GNU awk verwenden können die Zählungen und Summen zu sammeln, wenn ich dein Problem richtig zu verstehen, könnten Sie so etwas wie dieses benötigen:

BEGIN { mod = 1000 
     PROCINFO["sorted_in"] = "@ind_num_asc" 
     } 

    { 
     k= ($2 - ($2 % mod))/mod 
     sum[ k ]+= $6 
     cnt[ k ]++ 
    } 

END { 
     for(k in sum) printf("%d-%d\t%6.3f\n", k*mod +1, (k+1)*mod, sum[k]/cnt [k]) 
    } 
+0

Danke funktioniert perfekt! Nicht sicher, warum, aber die Ausgabe ist nicht in logischer Reihenfolge, also habe ich einfach Ihren Befehl in "sort" piped, um die numerische Reihenfolge wieder zu gewinnen –

+0

@RyanZapotocny Bitte werfen Sie einen Blick auf das Kapitel Controlling Scannen in der gawk Doku: https: // www .gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html können Sie im Abschnitt BEGIN eine 'PROCINFO [" sorted_in "] =" @ind_num_asc "Anweisung hinzufügen. Ich denke, das wird sich um das Sortierproblem kümmern. –

Verwandte Themen