分割大文件的最佳方法

Tay*_*r R 1 regex unix perl file csplit

我试图拆分一个巨大的文本文件(约5亿行文本),这是非常规则的,看起来像这样:

-- Start ---

blah blah

-- End --

-- Start --

blah blah

-- End --

...
Run Code Online (Sandbox Code Playgroud)

其中......暗示重复模式,"blah blah"具有可变长度~2000行.我想分开第一个

-- Start --

blah blah

-- End --
Run Code Online (Sandbox Code Playgroud)

阻塞到一个单独的文件并从FASTEST中的原始文件中删除它(运行时,给定我将运行这么多次)可能的方式.

理想的解决方案是从原始文件中删除初始块并将其粘贴到新文件中,而不加载巨大的初始文件的尾部.

我用以下方式尝试了csplit:

csplit file.txt /End/+1 
Run Code Online (Sandbox Code Playgroud)

这是一种有效的方法,但在时间上效率不高.

编辑:如果我们从文件中删除最后一个"开始结束"块而不是第一个块,是否有解决方案?

yst*_*sth 6

如果您希望从原始文件中删除开头,则您别无选择,只能读取和写入文件的其余部分.要删除结尾(正如您在编辑中所建议的那样),它可以更有效:

use File::ReadBackwards;
use File::Slurp 'write_file';
my $fh = File::ReadBackwards->new( 'inputfile', "-- End --\n" )
    or die "couldn't read inputfile: $!\n";
my $last_chunk = $fh->readline
    or die "file was empty\n";
my $position = $fh->tell;
$fh->close;
truncate( 'inputfile', $position );
write_file( 'lastchunk', $last_chunk );
Run Code Online (Sandbox Code Playgroud)