Если бы у меня был текстовый файл, содержащий 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
и происходит), всегда будет самым быстрым способом.