Como analisar um arquivo CSV com base em grupos feitos de um número específico de linhas?

1

Eu tenho um arquivo CSV que tem o seguinte formato:

Date,Towns,Count1,Count2
6/26/2015,HYDERABAD,234552,0
         ,KARIM NAGAR,7520,0
         ,RAJAMUNDRY,7248,256
         ,KURNOOL,5848,32,0
         ,TIRUPATI,8560,64,0
         ,VIJAYAWADA,16776,96,0,0,16872
         ,VIZAG,30264,624,8,0.0128205128205128,30888
         ,WARANGAL,14112,880,0,0,14992
         ,GUNTUR,10304,224,0,0,10528
6/27/2015,HYDERABAD,0,6960,0,0,6960
         ,KARIM NAGAR,0,0,0,ERROR,0
         ,RAJAMUNDRY,0,256,0,0,256
         ,KURNOOL,0,32,0,0,32
         ,TIRUPATI,0,64,0,0,64
         ,VIJAYAWADA,0,96,0,0,96
         ,VIZAG,0,528,0,0,528
         ,WARANGAL,0,880,0,0,880
         ,GUNTUR,0,224,0,0,224

Este CSV tem o número de colunas e linhas. As linhas são agrupadas com base nas datas de forma que cada cidade tenha seus contadores separados e o CSV tenha os valores de linha para cada cidade separados pela primeira coluna (data).

Existe uma maneira de ler esse arquivo CSV usando um shell script de forma que o código identifique o início e o fim de cada dia (que pode ser baseado na coluna de data ou na coluna town) e agrupe as linhas De acordo com aquilo? Digamos, eu quero encontrar o total de Count2 de 26/6/2015 (que será a soma de todas as cidades de HYDERABAD para GUNTUR em 26/06/2015)?

    
por Ankit Vashistha 13.07.2015 / 12:46

1 resposta

2

As linhas no seu CSV não têm o mesmo número de campos. Felizmente ignorando esse problema, no entanto, você poderia fazer algo assim:

awk -F, -v OFS=, '{ if($1 ~ /^[ \t]*$/) $1 = old; else old = $1 } 1' file.csv | \
    datamash -H -t, -g 1 sum 4

datamash acima é datamash do GNU . awk normaliza a primeira coluna e datamash faz o agrupamento e a soma.

Saída:

GroupBy(Date),sum(Count2)
6/26/2015,2176
6/27/2015,9040

Encontrar uma solução awk -on é deixado como um exercício (fácil) para o leitor. :)

    
por 13.07.2015 / 13:12