将包含多个日期记录的UNIX文件拆分为每个日期一个文件

3

我有一个UNIX CSV文件,其中包含如下记录 -

Merged_file.csv
USD,2015-09-22 02:34:43.0,XXX
USD,2015-09-22 03:31:43.0,XXX
USD,2015-09-22 04:35:43.0,XXX
USD,2015-09-23 03:31:43.0,XXX
USD,2015-09-23 02:34:43.0,XXX
USD,2015-09-23 03:37:43.0,XXX
USD,2015-09-23 04:32:43.0,XXX

我想把这个文件拆分成多个文件,每个文件只包含一个日期的记录。

需要的输出 -

File_2015-09-23.csv - 
USD,2015-09-23 03:31:43.0,XXX
USD,2015-09-23 02:34:43.0,XXX
USD,2015-09-23 03:37:43.0,XXX
USD,2015-09-23 04:32:43.0,XXX

File_2015-09-22.csv -
USD,2015-09-22 02:34:43.0,XXX
USD,2015-09-22 03:31:43.0,XXX
USD,2015-09-22 04:35:43.0,XXX

我尝试使用以下命令,但由于第二个字段是时间戳,它会为每个时间戳创建单独的文件,我无法想出如何仅以日期作为拆分文件的基本字符串 -
awk -F, '{print >  "File_"$2".csv"}' Merged_file.csv

感谢任何能帮助的人,请在这方面提供协助。
3个回答

5
你很接近了:
awk -F"[, ]" '{print >> "File_"$2".csv"}' Merged_file.csv

只需将分隔符更改为逗号和空格。同时将重定向更改为>>,这将内容附加到文件中。

我在想是否可以同时更改文件名。例如,包含2015-09-22数据的文件应该命名为File_2015-09-23.csv等等? - Kamlesh Gallani
在这种情况下,文件名规则是什么(如果09-22被命名为09-23,那么09-23数据怎么办,然后是09-24?) - NeronLeVelu
是的,假设文件名是日期“x”,则应该包含前一天日期“x-1”的数据,即每个文件包含前一天的数据。 - Kamlesh Gallani

1
Perl来拯救:
perl -F'[\s,]' -ane '
    open my $O, ">>", "File_$F[1].csv" or die $!;
    print {$O} $_;
    ' Merged_file.csv

1
如果您不想将<space>作为字段分隔符,您可以在第二个字段上进行拆分以获取日期部分:
 awk -F, '{ split($2, f, " "); print >  ("File_" f[1] ".csv")}' Merged_file.csv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接