Эффективный способ печати строк из массивного файла с помощью 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 ), всегда будет самым быстрым способом.

  • Regex не соответствует
  • Как сохранить сложное регулярное выражение для многократного повторного использования в sed?
  • найти строки, которые не заканчиваются на «rpms» с sed
  • sed для удаления ведущего 91, если число равно 12 цифрам
  • Присоединение нескольких команд sed в одном скрипте для обработки CSV-файла
  • Разделение строки до определенного места
  • Удалять конечные пробелы только из первого поля
  • Команда оболочки выполняется по-разному в терминале и скрипте
  • Работа с столбцами - awk и sed
  • Анализ файлов журнала с помощью sed -e. Нужно учитывать уникальные имена классов
  • Почему это совмещение регулярных выражений?
  • Linux и Unix - лучшая ОС в мире.