根据列的一部分拆分 CSV 文件

kia*_*ari 1 bash awk text-processing

我有一个 CSV 文件,file.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
Run Code Online (Sandbox Code Playgroud)

我想根据第 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我尝试使用sortawk来完成这项工作,但它根据日期和时间将文件分成 8 个文件。

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

如何仅根据日期(而不是日期和时间)分割文件?

gle*_*man 5

怎么样:

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

如果它是一个包含许多唯一日期的大文件,您可能需要通过以下方式防止“打开文件过多”错误:

  { print >> outfile[date]; close(outfile[date]) }
Run Code Online (Sandbox Code Playgroud)