Linux, большой текстовый файл, вырезать содержимое из строки A в строку B - PullRequest
1 голос
/ 06 декабря 2010

Я хочу вырезать кусок строки из большого текстового файла. Я знаю номер начала и конца строки. Какой самый элегантный способ вывести содержимое (строки между A и B) в какой-либо файл?

Я знаю команды головы и хвоста - есть ли еще более быстрый (один шаг) способ?

Файл имеет размер более 5 ГБ и содержит более 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 ]

7 голосов
/ 06 декабря 2010
sed -n '<A>,<B>p' input.txt
3 голосов
/ 06 декабря 2010

Это работает для меня в 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 голосов
/ 06 декабря 2010

Полагаю, большие файлы нуждаются в большем решении ...

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
0 голосов
/ 06 декабря 2010

Вот решение 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...