FastNetMon

Wednesday, 25 December 2013

Аггрегация данных на Bash

Довольно часто в системном администрировании и обработке данных в целом встает задача аггрегации данных (либо, кто знаком с алгоритмом map-reduce - редукция).

Что значит это заумное слово?

Например, у нас на входе есть данные по трафике по странам:

IR 195534
IR 2352503
IR 318617
IS 0
IS 4302
IS 6568
IT 172796
IT 44845798
IT 9604406
JE 0
JE 0
JE 0
JM 0
JM 16988
JM 956
JO 11528479
JO 569127
JO 98058
JP 1030332
JP 1103192
Особенность в том, что данные получены из нескольких источников и чтобы получить итоговые цифры, нужно для совпадающих первых полей сложить числа справа.

Как это красиво сделать на Bash?

А вот так:
cat raw_data| sort | awk '{sums[$1] += $2} END {for (a in sums) print a, sums[a]}' 
И на выходе мы получим аккуратную табличку:
JE 0
JM 17944
JO 12195664
IR 2866654
JP 2133524
IS 10870
IT 54623000
За мысли о реализации спасибо: http://stackoverflow.com/questions/13258902/simple-aggregation-using-linux-scripting

No comments :

Post a Comment

Note: only a member of this blog may post a comment.