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

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

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

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

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

решение1

Ни то, ни другое, используйте вместо этого 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

Перл:

$ 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и происходит), всегда будет самым быстрым способом.

Связанный контент