列の一部に基づいてCSVファイルを分割する

列の一部に基づいてCSVファイルを分割する

file.csv次の日付と時刻を含むCSVファイルがあります。

id0,2020-12-12T07:18:26,7f
id1,2017-04-28T19:59:00,80
id2,2017-04-28T03:14:35,e4
id3,2020-12-12T23:45:09,ff
id4,2020-12-12T09:12:34,a1
id5,2017-04-28T00:31:54,65
id6,2020-12-12T20:13:47,45
id7,2017-04-28T21:04:30,7f

2列の日付に基づいてファイルを分割したいです。上記の例では、次の2つのファイルが生成されます。

file_1.csv
id1,2017-04-28T19:59:00,80
id2,2017-04-28T03:14:35,e4
id5,2017-04-28T00:31:54,65
id7,2017-04-28T21:04:30,7f

そして

file_2.csv
id0,2020-12-12T07:18:26,7f
id3,2020-12-12T23:45:09,ff
id4,2020-12-12T09:12:34,a1
id6,2020-12-12T20:13:47,45

sortこれを試してみましたが、awk日付と時刻に基づいてファイルを8つのファイルに分割します。

sort -k2 -t, file.csv | awk -F, '!($2 in col) {col[$2]=++i} {print > ("file_" i ".csv")}'

日付と時刻ではなく日付のみに基づいてファイルを分割する方法は?

ベストアンサー1

どうですか?

awk -F', ' '
  { date = substr($2,1,10) }
  !(date in outfile) { outfile[date] = "file_" (++numout) ".csv" }
  { print > outfile[date] }
' file.csv

一意の日付が多い大容量ファイルの場合は、次の手順を実行して、「開いたファイルが多すぎます」エラーを回避できます。

  { print >> outfile[date]; close(outfile[date]) }

おすすめ記事