有人可以给出一些如何从Perl文件中删除最后n行的提示吗?我有一个大约400 MB的非常大的文件,我想从中删除大约125,000个最后一行.
您可以使用Tie :: File将文件作为数组处理.
use Tie::File; tie (@File, 'Tie::File', $Filename); splice (@File, -125000, 125000); untie @File;
另一种方法是在shell中使用head
和wc -l
.
编辑: grepsedawk提醒我们-n
选择head
,没有wc
必要:
head -n -125000 FILE > NEWFILE
由于人们已经建议使用Tie :: Array,这项工作做得很好,如果您想手动完成,我会列出基本算法.有些草率,缓慢的方法可以很好地处理小文件.这是为大文件执行此操作的有效方法.
在结尾的第N行之前找到文件中的位置.
在该点之后截断所有内容(使用truncate()
).
1是棘手的部分.我们不知道文件中有多少行或它们在哪里.一种方法是计算所有线,然后回到第N.这意味着我们每次都必须扫描整个文件.更高效的是从文件末尾向后读取.你可以这样做,read()
但是使用File :: ReadBackwards更容易,它可以逐行倒退(同时仍然使用有效的缓冲读取).
这意味着您只读取125,000行而不是整个文件. truncate()
应该是O(1)和原子,并且无论文件多大都几乎没有成本.它只是重置文件的大小.
#!/usr/bin/perl use strict; use warnings; use File::ReadBackwards; my $LINES = 10; # Change to 125_000 or whatever my $File = shift; # file passed in as argument my $rbw = File::ReadBackwards->new($File) or die $!; # Count backwards $LINES or the beginning of the file is hit my $line_count = 0; until( $rbw->eof || $line_count == $LINES ) { $rbw->readline; $line_count++; } # Chop off everything from that point on. truncate($File, $rbw->tell) or die "Could not truncate! $!";