当前位置:  开发笔记 > 编程语言 > 正文

如何删除文件的最后N行?

如何解决《如何删除文件的最后N行?》经验,为你挑选了2个好方法。

有人可以给出一些如何从Perl文件中删除最后n行的提示吗?我有一个大约400 MB的非常大的文件,我想从中删除大约125,000个最后一行.



1> Svante..:

您可以使用Tie :: File将文件作为数组处理.

use Tie::File;
tie (@File, 'Tie::File', $Filename);
splice (@File, -125000, 125000);
untie @File;

另一种方法是在shell中使用headwc -l.

编辑: grepsedawk提醒我们-n选择head,没有wc必要:

head -n -125000 FILE > NEWFILE



2> Schwern..:

由于人们已经建议使用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! $!";

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有