【发布时间】:2015-03-25 06:40:38
【问题描述】:
如果我有一个 L+1 行长的文件 bigfile.csv(包括一个标题),我的目标是尽可能均匀地将这个文件分成 N 个文件(比如 100 个),并将标题附加到每个文件中的分裂。假设我知道文件中有多少行,以及它需要拆分成多少个文件,这是先验的。
目前,我已经有了这个代码:
awk 'NR==1 {h=$0; next} (NR-2)% 100==0 {filename = sprintf("%04d",int((NR-2)/100)+1) ".smallfile.csv"; print h >> filename} {print >> filename}' bigfile.csv
虽然这段代码大部分时间都有效,但它有两个失败之处:
- 除非原始文件中的行数可以被 N 整除,否则将有 N-1 个文件的 ceil(L/N) 行,最后一个文件的行数明显少于其他文件。不过,这没什么大不了的。
- 在某些情况下,如果 N 很大并且 L 和 N 之间的比率很低,则不会有 N 个保证文件。例如,如果原始文件有 6021 行要拆分为 100 个文件,那么您最终只会得到 99 个文件,因为每个文件将有 61 行。
我将如何在 AWK 中执行此操作?理想情况下,给定上述示例,将 6021 行拆分为 100 个文件将有 21 个文件,其中 61 行,其余为 60 行。
我知道您可以在 unix 中使用 split(1) 并以循环方式进行,但这会改变行的顺序。稍后这些行将被分布式处理并重新组装,因此保持相同的顺序会更理想。
【问题讨论】: