2010-10-28 30 views
6

Tengo las siguientes filas en un archivo que quiero obtener el promedio de la tercera columna por hora.Promedio de columna por horas (filas) usando 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 

he hecho

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

con la salida

Average = 4.49154 

para obtener el promedio de todo el archivo, pero que quieren romper la media por hora. Puedo colar un grep durante la hora anterior a la salida de la tubería de awk, pero me gustaría, con suerte, hacerlo con un trazador de líneas.

Idealmente, la salida sería algo así como

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

y así sucesivamente.

No necesariamente buscando una respuesta, pero esperando que se lo apunte en la dirección correcta.

¡Muchas gracias!

KM

Respuesta

11

Me gustaría establecer el delimitador de campo a dos puntos, entonces agregada en una matriz asociativa de las diferentes claves de la matriz, y finalmente calcular los promedios:

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 

En los datos de prueba, esto da:

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

Esto debería producir la respuesta correcta incluso si los datos no están en orden cronológico (digamos que concatena dos archivos de registro fuera de secuencia). Tenga en cuenta que gawk sumará '3.123 segundos' valores numéricamente. El género final presenta los promedios en secuencia temporal; no hay garantía de que las claves se imprimirán en secuencia de tiempo.

+0

funciona como un encanto. gracias a ambos Jonathan y Novikov. Ahora voy a hacer ingeniería inversa e intentaré entender qué hacen las diferentes partes (especialmente las matrices) ... (-; –

3

Awk tiene matrices asociativas, para que pueda almacenar los promedios por hora.

Cuestiones relacionadas