Вычисление среднего значения в awk на основе состояния столбца в csv

Вычисление среднего значения в awk на основе состояния столбца в csv

У меня следующий csvформат.Там есть вальсы за весь месяц, но я их разделил на части:

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,

Мне нужно вычислить среднее значение первого столбца ($1) на основе значений за этот день ($4). Обратите внимание, что я могу переформатировать дату, если это необходимо для упрощения расчетов.

Моя жалкая попытка была такой:

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

Мне нужен такой вывод:

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*

решение1

Проверь это:

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

Объяснение:

-F,: Определяет разделитель. Альтернативно может бытьawk 'BEGIN{FS=","}...

Затем мы создаем два массива date1, date2в которых четвертое поле используем $4как индекс/ключ массива, а первое поле — $1как значение, добавленное к существующему значению той же позиции массива.

Итак, для первой строки мы будем иметь

date1[27:May:2017]+=2415.02
++date2[27:May:2017]--> увеличивает значение на 1 --> значение 1 для первой строки

Для следующей той же даты (строка 2) мы будем иметь

date1[27:May:2017]+=2415.02 + 3465.02
++date2[27:May:2017]--> увеличивает значение на 1 --> значение 2 (вторая строка)

Та же логика распространяется на все строки, имеющие одну и ту же дату, а также на все разные даты.

В конце мы используем forцикл для перебора ключей массива date1(или date2- ключи одинаковы в обоих массивах => $4) и для каждого keyнайденного выводим key(= дату $4), а также выводим date1[key]значение = сумму всех $1значений для той же даты $4, деленную на date2[key]значение = числовое количество найденных строк с той же датой = то же самое $4.

решение2

Вот вариант, использующийGNU-датамашдля усреднения:

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

Связанный контент