2010-10-28 13 views
6

Mam następujące wiersze w pliku, który chcę uzyskać średnią z 3 kolumna po godzinie.Średnia kolumna według godzin (wierszy) przy użyciu awk

2010-10-28 12:02:36: 5.1721851 secs 
2010-10-28 12:03:43: 4.4692638 secs 
2010-10-28 12:04:51: 3.3770310 secs 
2010-10-28 12:05:58: 4.6227063 secs 
2010-10-28 12:07:08: 5.1650404 secs 
2010-10-28 12:08:16: 3.2819025 secs 

2010-10-28 13:01:36: 2.1721851 secs 
2010-10-28 13:02:43: 3.4692638 secs 
2010-10-28 13:03:51: 4.3770310 secs 
2010-10-28 13:04:58: 3.6227063 secs 
2010-10-28 13:05:08: 3.1650404 secs 
2010-10-28 13:06:16: 4.2819025 secs 

2010-10-28 14:12:36: 7.1721851 secs 
2010-10-28 14:23:43: 7.4692638 secs 
2010-10-28 14:24:51: 7.3770310 secs 
2010-10-28 14:25:58: 9.6227063 secs 
2010-10-28 14:37:08: 7.1650404 secs 
2010-10-28 14:48:16: 7.2819025 secs 

Zrobiłem

cat filename | awk '{sum+=$3} END {print "Average = ",sum/NR}' 

z wyjściem

Average = 4.49154 

aby uzyskać średnią dla całego pliku, ale chcą przełamać średnio przez godzinę. Mogę przemycić grep na godzinę przed wypuszczeniem wyjścia do awk, ale chciałbym, miejmy nadzieję, zrobić to z jednym wkładem.

Idealnie, wyjście byłoby coś

Average 12:00 = _computed_avg_ 
Average 13:00 = _computed_avg_ 
Average 14:00 = _computed_avg_ 

i tak dalej.

Niekoniecznie szuka odpowiedzi, ale ma nadzieję, że zostanie wskazany we właściwym kierunku.

Wielkie dzięki!

KM

Odpowiedz

11

chciałbym ustawić ogranicznik pola do jelita grubego, a następnie agregat w tablicy asocjacyjnej dla różnych kluczy w tablicy i wreszcie obliczyć średnie:

gawk -F: 'NF == 4 { sum[$1] += $4; N[$1]++ } 
      END  { for (key in sum) { 
         avg = sum[key]/N[key]; 
         printf "%s %f\n", key, avg; 
        } }' filename | sort 

na Twoich danych testowych, to daje:

2010-10-28 12 4.348022 
2010-10-28 13 3.514688 
2010-10-28 14 7.681355 

Powinno to dać poprawną odpowiedź, nawet jeśli dane nie są w kolejności (powiedzmy, że łączą się dwa pliki dziennika z sekwencji). Zauważ, że gawk sumuje wartości "3.123 s" numerycznie. Ostateczny sort przedstawia średnie w sekwencji czasowej; nie ma gwarancji, że klucze zostaną wydrukowane w sekwencji czasowej.

+0

działa jak urok. dziękuję zarówno Jonathanowi, jak i Novikovowi. teraz go zrewiduję i spróbuję zrozumieć, co robią różne części (zwłaszcza tablice) ... (-; –

3

awk asocjacyjnych, dzięki czemu można przechowywać średnie przez godzinę.

Powiązane problemy