如何解析由特定行数组成的组的 CSV 文件?

如何解析由特定行数组成的组的 CSV 文件?

我有一个 CSV 文件,其格式如下:

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

此 CSV 具有列数和行数。这些行根据日期进行分组,每个城镇都有其单独的计数器,并且 CSV 具有每个城镇的行值,这些值由第一列(日期)分隔。

有没有办法使用 shell 脚本读取此 CSV 文件,以便代码识别每天的开始和结束(可以基于日期列或城镇列)并根据该情况对行进行分组?比如说,我想要找到 2015 年 6 月 26 日以来的 Count2 总数(这将是 2015 年 6 月 26 日从海得拉巴到贡图尔的所有城镇的总和)?

答案1

CSV 中的行没有相同数量的字段。然而,幸运的是忽略这个问题,你可以这样做:

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

datamash上面是GNU 数据混合awk标准化第一列,并datamash进行分组和求和。

输出:

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

寻找awk唯一的解决方案留给读者作为一个(简单的)练习。 :)

相关内容