Tengo el siguiente csv
formato.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 date1
y date2
en las que usamos el cuarto campo $4
como índice/clave de la matriz y el primer campo $1
como 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 for
bucle 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 key
encontrada imprimimos key
(= la fecha $4) y también imprimimos el date1[key]
valor = suma de todos $1
los 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