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

问题描述 投票:4回答:3

我试图使用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

但它们不是为了我的目的创造一个工作命令的顺序。有人对我有建议吗?谢谢!

bash csv awk
3个回答
3
投票

虽然你正在关闭后端的文件,但是当$1的值在那时改变时,之前$1的值.csv文件仍将在后端打开,所以不要在每一行关闭它们,请尝试关注并让我知道这是否有助于你(考虑到您的Input_file按照显示的样本进行排序,如果没有,那么我们必须按第1列对其进行排序并将其传递给awk命令)。

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

编辑:我可以看到你需要在每个$1输出文件中有一个标题,如果是这样,那么下面的代码也可以帮助你。

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

0
投票
awk '
    BEGIN { hdr = "num" OFS "date" OFS "time" OFS "lon" OFS "lat" }
    $1!=prev { close(out); out=$1".csv"; print hdr > out; idx=0; prev=$1 }
    { print ++idx, $0 > out }
' 2015full.csv

0
投票

如果不使用awk

for i in $(cut -d ' ' -f1 2015full.csv|uniq);do grep -w $i 2015full.csv|nl -w1 -s ' ' |sed "1i num date time lon lat" >$i.csv; done
© www.soinside.com 2019 - 2024. All rights reserved.