Calculando a média no awk com base na condição da coluna no csv

0

Eu tenho o seguinte formato csv . Existem vals de todo o mês, mas eu esbarrei :

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,

Eu preciso calcular a média da primeira coluna ($ 1) com base nos valores daquele dia ($ 4). Note que posso reformatar a data, se necessário, para facilitar o cálculo.

Minha tentativa miserável foi esta:

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

Eu preciso de um resultado assim:

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*
    
por fugitive 25.05.2017 / 00:41

2 respostas

3

Verifique isso:

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

Explicação:

-F, : define o delimitador. Como alternativa, pode ser awk 'BEGIN{FS=","}...

Em seguida, criamos dois arrays date1 e date2 nos quais usamos o quarto campo $4 como índice / chave da matriz e o primeiro campo $1 como valor adicionado ao valor existente da mesma posição da matriz.

Então, para a primeira linha, teríamos

date1[27:May:2017]+=2415.02 e ++date2[27:May:2017] - > aumenta o valor em 1 - > valor 1 para primeira linha

Para a próxima data (linha 2), teríamos

date1[27:May:2017]+=2415.02 + 3465.02 e ++date2[27:May:2017] - > aumenta o valor em 1 - > valor 2 (segunda linha)

A mesma lógica se estende a todas as linhas que possuem a mesma data e também a todas as datas diferentes.

No final, usamos um loop for para percorrer as chaves da matriz date1 (ou date2 - as chaves são iguais nas duas matrizes = > $4 ) e para cada key descobrimos que imprimimos key (= a data $ 4) e também imprimimos a date1[key] value = soma de todos os valores $1 para a mesma data $4 , dividido por date2[key] value = contagem numérica das linhas encontrado com a mesma data = mesmo $4 .

    
por 25.05.2017 / 00:50
2

Aqui está uma variante, usando o datamash do GNU para fazer a média:

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
    
por 25.05.2017 / 01:16