Что является хорошим способом извлечь, скажем, строки 20 -45 из огромного текстового файла. Не в интерактивном режиме, конечно!
command-line
text-processing
Крис Хуан-Ливер
источник
источник
awk NR==20,NR==45 textfile
тоже работает и легко читается.,
оператор диапазона awk .Еще проще:
Флаг -n отключает вывод по умолчанию. «20,45» адресует строки с 20 по 45 включительно. Команда "p" печатает текущую строку. И q выходит после печати строки.
источник
q
команды (все, начиная с;
) улучшило производительность при извлечении одной строки 26995107 из файла 27169334 строки.Это не ответ, но я не могу опубликовать его как комментарий.
Другой (очень быстрый) способ сделать это предложил mikeserv здесь :
Используя тот же тестовый файл, что и здесь, и ту же процедуру, вот несколько тестов (извлечение строк 1000020-1000045):
mikeserv :
Стефан :
Это, безусловно, самые быстрые решения, и различия незначительны (для одного прохода) (я пробовал с разными диапазонами: пара строк, миллионы строк и т. Д.).
Однако выполнение этого без конвейера может принести существенное преимущество приложению, которому необходимо выполнить поиск по нескольким диапазонам линий аналогичным образом, например:
... который печатает ...
... и читает файл только один раз.
Другие
sed
/awk
/perl
решения читают весь файл, и поскольку речь идет об огромных файлах, они не очень эффективны. Я добавил несколько вариантов, которыеexit
илиq
uit после последней строки в указанном диапазоне:Стефан :
против
dkagedal (
sed
):против
Стивен Д :
против
источник
awk NR==1000020,NR==1000045 textfile
в вашей системе.источник
python -c 'import fileinput, sys; [sys.stdout.write(line) for nr, line in enumerate(fileinput.input()) if 19 <= nr <= 44]'
? :-P Это то, что Ruby, созданный по образцу Perl, вдохновленный awk / sed, может сделать легко.Поскольку sed и awk уже были заняты, вот решение perl:
Или, как указано в комментариях:
источник
perl -ne'print if 20..45' textfile