特定の行数のグループで構成される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には最初の列(日付)で区切られた各村の行値があります。

コードが毎日の開始と終了を認識し(日付列または都市列に基づいている可能性があります)、それに基づいて行をグループ化できるように、シェルスクリプトを使用してこのCSVファイルを読み取る方法はありますか?たとえば、2015年6月26日以降、Count2の総数を探したいと思います(これは2015年6月26日にハイデラバードからGunturまでのすべての都市の合計になります)。

答え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読者にとって(簡単な)練習問題として残されます。 :)

関連情報