Эффективный способ печати строк из массивного файла с помощью awk, sed или что-то еще?

Если бы у меня был файл с открытым текстом, содержащий 8 миллионов строк, и я хочу распечатать на экране строки от 4 000,010 до 4,000,000, что было бы более эффективным: awk или sed?

В тексте нет шаблона, и, к сожалению, база данных не является вариантом. Я знаю, что это не идеально, мне просто любопытно, на какой вопрос быстрее выполнить задачу.

Или, может быть, есть даже лучшая альтернатива sed или awk?

One Solution collect form web for “Эффективный способ печати строк из массивного файла с помощью awk, sed или что-то еще?”

Не используйте вместо этого tail или head :

 $ time tail -n 4000001 foo | head -n 11 real 0m0.039s user 0m0.032s sys 0m0.004s $ time head -n 4000010 foo | tail -n 11 real 0m0.055s user 0m0.064s sys 0m0.036s 

tail на самом деле последовательно быстрее. Я выполнил обе команды 100 раз и вычислил их среднее значение:

хвост:

 real 0.03962 user 0.02956 sys 0.01456 

глава:

 real 0.06284 user 0.07356 sys 0.07244 

Я предполагаю, что tail быстрее, потому что, хотя он должен искать путь до линии 4e10, он фактически ничего не печатает, пока он не попадет туда, пока head будет печатать все до строки 4e10 + 10.


Сравните с некоторыми другими методами, отсортированными по времени:

СЭД:

 $ time sed -n 4000000,4000011p;q foo real 0m0.312s user 0m0.236s sys 0m0.072s 

Perl:

 $ time perl -ne 'next if $.<4000000; print; exit if $.>=4000010' foo real 0m1.000s user 0m0.936s sys 0m0.064s 

AWK:

 $ time awk '(NR>=4000000 && NR<=4000010){print} (NR==4000010){exit}' foo real 0m0.955s user 0m0.868s sys 0m0.080s 

В принципе, правило – чем меньше вы разбираетесь, тем быстрее вы это делаете. Обработка ввода как потока данных, который нужно распечатать только на экране (как tail ), всегда будет самым быстрым способом.

  • Разделить текстовый файл на несколько файлов по содержимому столбца
  • Печать регулярного выражения Sed в файл .txt
  • используя Sed для поиска и замены строки внутри файла
  • Как включить все до Colon в Sed / Grep / ...?
  • grep first n и последние n символов из строки в файле
  • Инкрементная арифметика Sed
  • Добавьте двойную кавычку, если между словами в столбце есть пробел
  • замените пустое значение на предыдущее значение первого столбца, используя awk и sed
  • Многострочная обработка текста: редактирование sshd_config
  • Наложение символа между повторяющимися символами
  • Нет результата при использовании нескольких файлов write & sed в сценарии оболочки
  • Linux и Unix - лучшая ОС в мире.