Regex Awk无法拆分大文件(10Gb+;)

Regex Awk无法拆分大文件(10Gb+;),regex,ubuntu,unix,awk,ssh,Regex,Ubuntu,Unix,Awk,Ssh,我尝试使用以下脚本在预先指定的空行数上拆分一个大(10Gb+)文本文件: awk 'BEGIN {nParMax = 100000; npar = 0 ;nFile =0} /^$/{npar++;if(npar==nParMax){nFile++;npar=0;next}} {print $0 > "split_"nFile".out"}' fname 脚本在1Gb以下的文件上工作正常,但当我在较大的文件上运行它时,文件的结

我尝试使用以下脚本在预先指定的空行数上拆分一个大(10Gb+)文本文件:

awk 'BEGIN {nParMax = 100000; npar = 0 ;nFile =0}
     /^$/{npar++;if(npar==nParMax){nFile++;npar=0;next}}
     {print $0 > "split_"nFile".out"}'  fname
脚本在1Gb以下的文件上工作正常,但当我在较大的文件上运行它时,文件的结尾在一个随机位置被完全分割(“随机”意味着我不理解它为什么在这个位置分割。它可能是(I)一次分割的第一个字段的结尾,或者(ii)另一次分割的字段的中间,或者(iii)另一行的中间。不过,如果我重复拆分实验,awk总是在同一个位置拆分(据我所知)

“随机”分割的段落的其余部分丢失。新拆分始终从拆分后的行(空行)干净地开始

启用特殊字符的最后一段示例:

# sent_id = 170247_3$
# text = В то же время видеокадры с места событий свидетельствуют о том, что после звука, похожего на выстрел, находившихся на площади людей охватила паника.$
1^IВ^I_^IADP^I_^I_^I4^Icase^I_^IO$
2^Iто^I_^IDET^I_^IAnimacy=Inan|Case=Acc|Gender=Neut|Number=Sing^I4^Idet^I_^IO$
3^Iже^I_^IPART^I_^I_^I2^Iadvmod^I_^IO$
4^Iвремя^I_^INOUN^I_^IAnimacy=Inan|Case=Acc|Gender=Neut|Number=Sing^I9^Iobl^I_^IO$
5^Iвидеокадры^I_^INOUN^I_^IAnimacy=Inan|Case=Nom|Gender=Masc|Number=Plur^I9^Insubj^I_^IO$
6^Iс^I_^IADP^I_^I_^I7^Icase^I_^IO$
7^Iместа^I_^INOUN^I_^IAnimacy=Inan|Case=Gen|Gender=Neut|Number=Sing^I5^Inmod^I_^IO$
8^Iсобытий^I_^INOUN^I_^IAnimacy=Inan|Case=Gen|Gender=Neut|Number=Plur^I7^Inmod^I_^IO$
9^Iсвидетельствуют^I_^IVERB^I_^IAspect=Imp|Mood=Ind|Number=Plur|Person=3|Tense=Pres|VerbForm=Fin|Voice=Act^I0^Iroot^I_^IO$
10^Iо^I_^IADP^I_^I_^I11^Icase^I_^IO$
11^Iтом^I_^IPRON^I_^IAnimacy=Inan|Case=Loc|Gender=Neut|Number=Sing^I9^Iobl^I_^IO$
12^I,^I_^IPUNCT^I_^I_^I25^Ipunct^I_^IO$
13^Iчто^I_^ISCONJ^I_^I_^I25^Imark^I_^IO$
14^Iпосле^I_^IADP^I_^I_^I15^Icase^I_^IO$
15^Iзвука^I_^INOUN^I_^IAnimacy=Inan|Case=Gen|Gender=Masc|Number=Sing^I25^Iobl^I_^IO$
16^I,^I_^IPUNCT^I_^I_^I17^Ipunct^I_^IO$
17^Iпохожего^I_^IADJ^I_^ICase=Gen|Degree=Pos|Gender=Masc|Number=Sing^I15^Iamod^I_^IO$
18^Iна^I_^IADP^I_^I_^I19^Icase^I_^IO$
19^Iвыстрел^I_^INOUN^I_^IAnimacy=Inan|Case=Acc|Gender=Masc|Number=Sing^I17^Iobl^I_^IO$
20^I,^I_^IPUNCT^I_^I_^I15^Ipunct^I_^IO$
21^Iнаходившихся^I_^IVERB^I_^IAnimacy=Anim|Aspect=Imp|Case=Acc|Number=Plur|Tense=Past|VerbForm=Part|Voice=Act^I24^Iacl^I_^IO$
22^Iна^I_^IADP^I_^I_^I23^Icase^I_^IO$
结果拆分在第3行(这是第一次拆分的尾部):

如果我将文件拆分到1Gb以下,问题就会消失

为了以防万一,这个拆分是在一个带有128GB内存的Ubuntu服务器上完成的,在bash中通过SSH使用GNU Awk 4.1.4


有什么办法可以解决这个问题?

如果你的代码在1Gb文件上运行良好,你可以尝试使用split命令将输入文件拆分成更小的文件,然后在分割的文件上运行awk代码

要将文件拆分为每个500行的文件:

split -l 500 myfile segment
split -b 1G myfile segment
输出文件将是segmentaa、segmentab、segmentac

要将文件拆分为每个大小为1Gb的文件:

split -l 500 myfile segment
split -b 1G myfile segment

输出文件将是10个文件名SECTIONAA、SECTIONAB、SECTIONAC…

注释不用于扩展讨论;这段对话一直在讨论。如何用随机行拆分来代替结构良好的文本文件的空行拆分?@EdMorton这与在错误的位置使用awk拆分没有什么不同。可能会有数千次拆分,如果拆分正确,则应进行检查,然后重新洗牌、合并、按80/20拆分,最后进行解析。