我正在引用一个类似的问题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> $ 1}'file1
对于这个例子,我可以通过两个步骤轻松达到目标。对于我的真实文件,我想在第一列中拆分一个大约200Gig的大文件,其中包含10百万个唯一值。我希望每个文件大约有1,000,000行(即灵活的阈值)。分两步制作是不可行的,因为我不能生成数百万个文件。有什么想法吗?
答案 0 :(得分:1)
双击扫描你可以做的文件
$ awk -F\| -v size=5 'NR==FNR {a[$1]++; next}
FNR==1 || p!=$1 {if(count+a[$1]>=size) {f++; count=0}
else count+=a[$1]; p=$1}
{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。