我正在尝试使用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
但它们不是为我的目的创建工作命令的顺序。有人对我有建议吗?谢谢!
答案 0 :(得分:3)
虽然您正在关闭后端的文件,但当$1
的值将在此时更改时,之前$1
的值.csv
文件仍会在后端打开,而不是在每一行上关闭它们,尝试关注并让我知道这是否对您有所帮助(考虑到您的Input_file按照显示的样本进行排序,如果没有,那么我们必须按第一列对其进行排序并将其传递给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
答案 1 :(得分: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
答案 2 :(得分: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