bash - 拆分 CSV 并使用 awk 添加标题和索引列

标签 bash csv awk

我正在尝试使用 awk 根据日期将大型 CSV 拆分为较小的文件。尽管它返回“太多打开的文件”错误,但我有基本的命令在工作。所以我读过要关闭文件,但是写入的命令在每个文件只写入一行后关闭它。

awk -F' ' '{close($1".csv")}{print > ($1".csv")}' 2015full.csv 

此外,我想为每个拆分文件添加一个标题行和一个索引列。我的数据如下:

2015full.csv

2015-12-24 18:20:57 -87.2788204 36.5984675 0
2015-12-24 18:20:42 -87.2784049 36.597298699999996 0
2015-12-24 18:20:26 -87.274402 36.5932405 0
2015-12-23 18:20:10 -87.25762519999999 36.572330400000006 0
2015-12-23 18:19:40 -87.25762519999999 36.572330400000006 0
2015-12-23 18:19:21 -87.25762519999999 36.572330400000006 0

我正在尝试:

2015-12-24.csv

num date time lon lat
1 2015-12-24 18:20:57 -87.2788204 36.5984675
2 2015-12-24 18:20:42 -87.2784049 36.597298699999996
3 2015-12-24 18:20:26 -87.274402 36.5932405

2015-12-23.csv

num date time lon lat
1 2015-12-23 18:20:10 -87.25762519999999 36.572330400000006
2 2015-12-23 18:19:40 -87.25762519999999 36.572330400000006
3 2015-12-23 18:19:21 -87.25762519999999 36.572330400000006

我可能有以下正确的部分:

awk -F' ' 'NR==1{print “num”, $0; “date”, $1; “time”, $2; “lon”, $3; “lat”, $4; next}{print (NR-1), $0}{close($1".csv")}{print > ($1".csv")}' 2015full.csv

但它们的顺序并没有为我的目的创建一个有效的命令。有人对我有建议吗?谢谢!

最佳答案

虽然您正在后端关闭文件,但是当 $1 的值将在那时更改之前 $1 的值 .csv文件仍将在后端打开,因此不要在每一行都关闭它们,请尝试按照以下方式告诉我这是否对您有帮助(考虑到您的 Input_file 已按照显示的示例进行排序,如果没有,则我们必须按第一列对其进行排序,然后将其通过管道传输到 awk 命令)。

awk -F' ' 'prev!=$1{close(prev".csv")}{print > ($1".csv");prev=$1}' 2015full.csv 

编辑: 我可以看到您在每个 $1 输出文件中都需要一个 header ,如果是这样,那么以下代码也可能对您有所帮助.

awk -F' ' 'prev!=$1{close(prev".csv");print "num date time lon lat" > ($1".csv")}{print > ($1".csv");prev=$1}' 2015full.csv

关于bash - 拆分 CSV 并使用 awk 添加标题和索引列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48015696/

相关文章:

bash - “moveToLocal: Option ' -moveToLocal'尚未执行什么操作。”手段?

python - 如何使用 python 删除 CSV 文件的第一行?

python - 我应该如何读取和使用 ~40GB csv 中的数据进行时间序列预测?

perl - 将非常大的 csv 文件与公共(public)列合并

linux - Fuser 无法统计文件 - 奇怪的行为

bash - 在Ubuntu中,如何删除当前目录中某个用户的所有文件

csv - SSRS 2012 和 CSV 导出

bash - 比较不同文件中的两列并为共享项追加数据 - UNIX

regex - 如何使用 grep/sed/awk 从文本文件开头删除模式

bash - 实时读取两个文件