根据第一列值将大文件拆分为具有一定行数的文件

split large file into files with a set number of lines based on 1st column value

我故意引用了一个类似的问题here,尽管我不想要尽可能多的文件,因为第 1 列中有不同的值。例如,来自:

A.B|100|20
A.B|101|20
A.X|101|30
A.X|1000|20
B.Y|1|1
B.Y|1|2

我想将它分成 x 个文件,每个文件最多包含 5 行。在示例中,我想要 2 个文件:

A.B|100|20
A.B|101|20
A.X|101|30
A.X|1000|20

B.Y|1|1
B.Y|1|2

awk -F\| '{print>}' file1

对于这个例子,我可以轻松地通过 2 步达到目标。对于我的真实文件,我想拆分一个大约 200Gig 的大文件,第一列中有 1000 万个唯一值。我希望每个文件有大约 1,000,000 行(即灵活的阈值)。分两步完成是不可行的,因为我负担不起生成数百万个文件。有什么想法吗?

双扫描文件即可

$ awk -F\| -v size=5 'NR==FNR  {a[]++; next} 
               FNR==1 || p!= {if(count+a[]>=size) {f++; count=0} 
                                else count+=a[]; p=} 
                               {print > "_file_"f+0}' file{,}

$ head _f*
==> _file_0 <==
A.B|100|20
A.B|101|20
A.X|101|30
A.X|1000|20

==> _file_1 <==
B.Y|1|1
B.Y|1|2

但是请注意,如果其中一个唯一键可以包含比所需文件长度更多的记录,则不拆分和保持最大文件长度将发生冲突。在此脚本中,我假设不拆分更为重要。例如,对于相同的输入文件更改,设置 size=1。密钥不会被拆分成单独的文件,但文件长度会超过 1。