使用awk按列拆分CSV文件

3

我有一个CSV文件需要按日期拆分。我尝试使用下面列出的AWK代码(在此处找到)。

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文件,其中包含特定日期的所有行。我是否忽略了什么?

当你说“无响应”时,你等了多久? - William Pursell
它运行时间不到一秒钟(提示符返回)。我观察了几分钟文件夹,看是否有任何内容生成,但没有。我还搜索了我的系统,看看文件是否在其他地方被创建,但没有找到。 - Lenwood
已解决。是我的行尾符问题。遵循这个帖子的指引,我使用了file data.csv命令来检查文件格式。我发现是Mac风格的行尾符,所以我使用Text Wrangler更改了格式,现在上面的代码按预期工作。 - Lenwood
@Lenwood - 把它作为答案添加并接受,这样问题就会关闭。不过你不会得到任何积分 :-) - Fredrik Pihl
@FredrikPihl 我已经在下面添加了答案。现在我可以将其标记为关闭,还是必须等待2天? - Lenwood
其实不知道。试一下看看是否有效。 - Fredrik Pihl
2个回答

5
我已经解决了这个问题。按照这篇文章的逻辑,我使用file命令检查了我的行尾,并了解到该文件具有旧式的Mac行终止符。我用Text Wrangler打开了我的输入CSV文件,并以Unix样式行结束再次保存。一旦我这样做了,上述的awk命令就像预期的那样工作了。它只需要大约5秒钟的时间,就可以按日期拆分出63个新的CSV文件。

发布的命令将会产生输出,但可能过于冗长和低效。该脚本在每一行后关闭输入文件,然后在下一个匹配行上重新打开它。这样做可能是为了尽可能少地同时打开输出文件,但对于像gawk这样的现代awk来说,这根本不是问题。你应该能够只执行以下命令:awk -F, 'NR>1 {print > ($1 ".csv")}' file.csv - Ed Morton

0

用于检索使用“;”分隔符的日志文件中的信息,我使用以下代码:

grep "END SESSION" filename.log | cut -d";" -f2

在哪里

  -d, --delimiter=DELIM   use DELIM instead of TAB for field delimiter
  -f, --fields=LIST       select only these fields;  also print any line
                          that contains no delimiter character, unless
                          the -s option is specified

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