2013-03-15 228 views
2

我有一个CSV文件,需要按日期进行拆分。我试过使用下面列出的AWK代码(找到elsewhere)。使用awk按列分割CSV文件

awk -F"," 'NR>1 {print $0 >> ($1 ".csv"); close($1 ".csv")}' file.csv

我已经试过在OS X和Debian的终端中运行此。在这两种情况下都没有错误消息(所以代码似乎正常运行),但也没有输出。没有输出文件,并且在命令行中没有响应。

我的输入文件有〜6K行的数据,看起来像这样:

date,source,count,cost 
2013-01-01,by,36,0 
2013-01-01,by,42,1.37 
2013-01-02,by,7,0.12 
2013-01-03,by,11,4.62 

包含特定日期的所有行要创建什么,我想是一个新的CSV文件。我忽略了什么?

+0

当你的方式“没有回应”;你还等多久? – 2013-03-15 19:33:22

+0

它运行时间不到一秒(提示返回)。我已经观看了文件夹几分钟,看是否有任何东西填充,但没有。我也搜索了我的系统,看看这些文件是否在其他地方创建,但没有运气。 – Lenwood 2013-03-15 19:39:05

+0

已解决。这是我的线路结局。在[this thread](http://stackoverflow.com/a/2652526/297780)的领导之后,我使用'file data.csv'命令来检查文件格式。我有Mac样式行结束,所以我使用文本牧马人来改变格式,现在上面的代码按预期工作。 – Lenwood 2013-03-15 19:51:55

回答

2

我解决了这个问题。按照this thread的逻辑,我使用file命令检查了我的行尾,并获知该文件具有旧式Mac行终止符。我用Text Wrangler打开了我的输入CSV文件,并使用Unix样式行结束符再次保存它。一旦我这样做,上面列出的awk命令按预期工作。大约需要5秒钟才能创建63个按日期分列的新CSV文件。

+2

+1自己解决它 – 2013-03-15 20:09:55

+0

张贴的命令将产生输出,但它可能过长而且效率低下。该脚本将在每行之后关闭输入文件,然后在下一个匹配行重新打开它。这可能是因为尽可能少的输出文件可以同时打开,但使用gawk这样的现代awk并不是问题。你应该可以这样做:'awk -F,'NR> 1 {print>($ 1“.csv”)}'file.csv' – 2013-03-16 02:52:31