我正在尝试使用 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/