Calcular el promedio en awk según la condición de la columna en csv

Calcular el promedio en awk según la condición de la columna en csv

Tengo el siguiente csvformato.Hay valores de todo el mes, pero los he fragmentado.:

2415.02,2203.35,00:17,25:May:2017,
3465.02,2203.35,01:17,25:May:2017,
2465.02,2203.35,12:17,26:May:2017,
465.02,2203.35,13:17,26:May:2017,
245.02,2203.35,14:17,26:May:2017,
2465.02,2203.35,05:17,26:May:2017,
2865.02,2203.35,06:17,27:May:2017,
2490.12,2203.35,07:17,27:May:2017,

Necesito calcular el promedio de la primera columna ($1) en función de los valores de ese día ($4). Tenga en cuenta que puedo reformatear la fecha, si es necesario para facilitar el cálculo.

Mi miserable intento fue este:

$ awk  '{FS=","; day=$4;value+=$1} END{ print  day,value/NR}' file
27:May:2017 2109.41

Necesito un resultado como este:

Average for 25th May is *average_for_25th_day*
Average for 27th May is *average_for_26th_day*
Average for 28th May is *average_for_27th_day*

Respuesta1

Mira esto:

awk -F, '{date1[$4]+=$1;++date2[$4]}END{for (key in date1) print "Average of",key,"is",date1[key]/date2[key]}' file
Average of 27:May:2017 is 2677.57
Average of 26:May:2017 is 1410.02
Average of 25:May:2017 is 2940.02

Explicación:

-F,: Define el delimitador . Alternativamente podría serawk 'BEGIN{FS=","}...

Luego creamos dos matrices date1y date2en las que usamos el cuarto campo $4como índice/clave de la matriz y el primer campo $1como valor agregado al valor existente de la misma posición de la matriz.

Entonces para la primera fila tendríamos

date1[27:May:2017]+=2415.02
++date2[27:May:2017]--> aumenta el valor en 1 --> valor 1 para la primera línea

Para la siguiente misma fecha (línea 2) tendríamos

date1[27:May:2017]+=2415.02 + 3465.02
++date2[27:May:2017]--> aumenta el valor en 1 --> valor 2 (segunda línea)

La misma lógica se extiende a todas las líneas que tienen la misma fecha y también a todas las fechas diferentes.

Al final, usamos un forbucle para iterar a través de las claves de la matriz date1(o date2- las claves son las mismas en ambas matrices => $4) y para cada keyencontrada imprimimos key(= la fecha $4) y también imprimimos el date1[key]valor = suma de todos $1los valores para la misma fecha $4, divididos por date2[key]valor = recuento numérico de las líneas encontradas que tienen la misma fecha = igual $4.

Respuesta2

Aquí hay una variante, usandoMezcla de datos GNUpara hacer el promedio:

datamash -t, groupby 4 mean 1 < file | 
  awk -F'[,:]' '{printf "Average for %dth %s is %f\n", $1,$2,$4}'
Average for 25th May is 2940.020000
Average for 26th May is 1410.020000
Average for 27th May is 2677.570000

información relacionada