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

Bash 拆分CSV并使用awk添加标题和索引列,bash,csv,awk,Bash,Csv,Awk,我正在尝试使用awk根据日期将大型CSV拆分为较小的文件。虽然基本命令返回“打开的文件太多”错误,但它仍在工作。所以我读了关闭文件的命令,但是在每个文件中只写入一行之后,这个命令就会以书面形式关闭它 awk -F' ' '{close($1".csv")}{print > ($1".csv")}' 2015full.csv 此外,我想为每个拆分文件添加一个标题行和一个索引列。我的数据如下所示: 2015full.csv 我正试图得到: 2015-12-24.csv 2015-12-23

我正在尝试使用awk根据日期将大型CSV拆分为较小的文件。虽然基本命令返回“打开的文件太多”错误,但它仍在工作。所以我读了关闭文件的命令,但是在每个文件中只写入一行之后,这个命令就会以书面形式关闭它

awk -F' ' '{close($1".csv")}{print > ($1".csv")}' 2015full.csv 
此外,我想为每个拆分文件添加一个标题行和一个索引列。我的数据如下所示:

2015full.csv

我正试图得到:

2015-12-24.csv

2015-12-23.csv

我可能有以下正确的作品:

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
文件仍将在后端打开,因此不要在每行关闭它们,请尝试以下操作,并让我知道这是否有助于您(考虑到您的输入_文件是按照所示的示例排序的,如果不是,我们必须按第1列对其进行排序,并将其传送到
awk
命令)

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

awk -F' ' 'prev!=$1{close(prev".csv");print "num date time lon lat" > ($1".csv")}{print > ($1".csv");prev=$1}' 2015full.csv
如果不使用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

如果文件被排序,不要关闭文件,直到你到达一个新的日期。如果它没有排序,考虑排序它。很好,但我没有吸引足够的注意,在原来的职位,我需要一个索引栏也…@ Luteser,高兴的是,它为你工作,见此,而这个代码片段可能是解决方案,真的有助于改善e您的文章质量。请记住,您是在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。虽然此代码片段可能是解决方案,但确实有助于提高您的文章质量。请记住,您是在为将来的读者以及这些人回答问题可能不知道代码建议的原因。
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
awk -F' ' 'prev!=$1{close(prev".csv")}{print > ($1".csv");prev=$1}' 2015full.csv 
awk -F' ' 'prev!=$1{close(prev".csv");print "num date time lon lat" > ($1".csv")}{print > ($1".csv");prev=$1}' 2015full.csv
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
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