Среднее значение столбца по часам (строкам) с использованием awk - PullRequest
6 голосов
/ 28 октября 2010

У меня есть следующие строки в файле, которые я хочу получить среднее значение 3-го столбца по часам.

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

Я сделал

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

с выводом

Average =  4.49154

, чтобы получить среднее значение для всего файла, но хочу разбить среднее начас.Я могу прокрутить grep за час до отправки вывода в awk, но я хотел бы, надеюсь, сделать это с одним вкладышем.

В идеале, вывод будет примерно таким:

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

и так далее.

Не обязательно искать ответ, но надеяться, что его укажут в правильном направлении.

Ответы [ 2 ]

11 голосов
/ 28 октября 2010

Я бы установил разделитель полей на двоеточие, затем агрегировал в ассоциативный массив для различных ключей в массиве и, наконец, вычислял средние значения:

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

На ваших тестовых данных это дает:

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

Это должно дать правильный ответ, даже если данные не во временном порядке (скажем, вы сцепили два файла журнала не по порядку). Обратите внимание, что gawk будет суммировать значения «3.123 сек» численно. Финальная сортировка представляет средние значения во временной последовательности; нет никакой гарантии, что ключи будут напечатаны во временной последовательности.

3 голосов
/ 28 октября 2010

Awk имеет ассоциативные массивы, поэтому вы можете хранить средние значения по часам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...