我想从大文本文件中删除一大块行。我知道开始和结束行号。将内容(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 。最快,最短。我认为查克诺里斯会使用它。
答案 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)
我猜大文件需要更大的解决方案......
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