我有一个巨大的 CSV 文件,有 100 万行。我想知道是否有一种方法可以将此文件拆分为较小的文件,但保留所有文件的第一行(CSV 标题)。
它似乎split
速度非常快,但也非常有限。您不能向文件名添加后缀,例如.csv
.
split -l11000 products.csv file_
有没有一种有效的方法来完成这项任务bash
?一行命令就太好了。
这个问题的答案是yes,这可以通过 AWK 实现。
这个想法是记住标题并以表单的文件名打印所有其余部分filename.00001.csv
:
awk -v l=11000 '(NR==1){header=$0;next}
(NR%l==2) {
close(file);
file=sprintf("%s.%0.5d.csv",FILENAME,++c)
sub(/csv[.]/,"",file)
print header > file
}
{print > file}' file.csv
其工作原理如下:
-
(NR==1){header=$0;next}
:如果记录/行是第一行,则将该行保存为header.
-
(NR%l==2){...}
: Every time we wrote l=11000
records/lines, we need to start writing to a new file. This happens every time the modulo of the record/line number hits 2. This is on the lines 2, 2+l, 2+2l, 2+3l,.... When such a line is found we do:
-
close(file)
:也关闭您刚刚编写的文件。
-
file=sprintf("%s.%0.5d.csv",FILENAME,++c); sub(/csv[.]/,"",file)
:将新文件名定义为FILENAME.00XXX.csv
-
print header > file
:打开文件并将标头写入该文件。
-
{print > file}
:将条目写入文件。
note:如果您不关心文件名,可以使用以下较短版本:
awk -v m=100 '
(NR==1){h=$0;next}
(NR%m==2) { close(f); f=sprintf("%s.%0.5d",FILENAME,++c); print h > f }
{print > f}' file.csv
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)