Linux,大文本文件,从A行到B行删除内容

时间:2010-12-06 12:29:48

标签: linux shell

我想从大文本文件中删除一大块行。我知道开始和结束行号。将内容(A和B之间的线)输出到某个文件的最优雅的方法是什么?

我知道头部和尾部的命令 - 是否还有更快(一步)的方式?

该文件超过5GB,包含超过81百万行。

更新:结果

time sed -n 79224100,79898190p BIGFILE.log > out4.log
real    1m9.988s

time tail -n +79224100 BIGFILE.log | head -n +`expr 79898190 - 79224100` > out1.log
real    1m11.623s

time perl fileslice.pl BIGFILE.log 79224100 79898190 > out2.log
real    1m13.302s

time python fileslice.py 79224100 79898190 < BIGFILE.log > out3.log
real    1m13.277s

获胜者 sed 。最快,最短。我认为查克诺里斯会使用它。

4 个答案:

答案 0 :(得分:7)

sed -n '<A>,<B>p' input.txt

答案 1 :(得分:3)

这适用于GNU sed

sed -n 'I,$p; Jq'

处理指示的行时q退出。

例如,这些大数字起作用:

$ yes | sed -n '200000000,${=;p};200000005q'
200000000
y
200000001
y
200000002
y
200000003
y
200000004
y
200000005
y

答案 2 :(得分:2)

我猜大文件需要更大的解决方案......

fileslice.py:

import sys
import itertools

for line in itertools.islice(sys.stdin, int(sys.argv[1]) - 1, int(sys.argv[2])):
  sys.stdout.write(line)

调用:

python fileslice.py 79224100 79898190 < input.txt > output.txt

答案 3 :(得分:0)

这是一个perl解决方案:)

<强> fileslice.pl:

#!/usr/bin/perl

use strict;
use warnings;
use IO::File;

my $first = $ARGV[1];
my $last = $ARGV[2];
my $fd = IO::File->new($ARGV[0], 'r') or die "Unable to open file $ARGV[0]: $!\n";
my $i = 0;
while (<$fd>) {
    $i++;
    next if ($i < $first);
    last if ($i > $last);
    print $_;
}

开始
perl fileslice.pl file 79224100 79898190