Si tuviera un archivo de texto plano que contuviera 8 millones de líneas y quisiera imprimir las líneas 4.000.010 a 4.000.000 en la pantalla, ¿cuál sería más eficiente: awk o sed?
No hay ningún patrón en el texto y, lamentablemente, una base de datos no es una opción. Sé que esto no es ideal, solo tengo curiosidad por saber cuál completaría la tarea más rápido.
¿O tal vez exista incluso una alternativa mejor que sed o awk?
Respuesta1
Ninguno, use tail
o head
en su lugar:
$ 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
De hecho, es consistentemente más rápido. Ejecuté ambos comandos 100 veces y calculé su promedio:
cola:
real 0.03962
user 0.02956
sys 0.01456
cabeza:
real 0.06284
user 0.07356
sys 0.07244
Me imagino tail
que es más rápido porque, aunque tiene que buscar hasta la línea 4e10, en realidad no imprime nada hasta llegar allí, mientras que head
imprimirá todo hasta la línea 4e10 + 10.
Compare con algunos otros métodos ordenados por tiempo:
sed:
$ time sed -n 4000000,4000011p;q foo
real 0m0.312s
user 0m0.236s
sys 0m0.072s
Perla:
$ time perl -ne 'next if $.<4000000; print; exit if $.>=4000010' foo
real 0m1.000s
user 0m0.936s
sys 0m0.064s
mal:
$ time awk '(NR>=4000000 && NR<=4000010){print} (NR==4000010){exit}' foo
real 0m0.955s
user 0m0.868s
sys 0m0.080s
Básicamente, la regla es que cuanto menos analices, más rápido serás. Tratar la entrada como un flujo de datos que solo necesita imprimirse en la pantalla (como tail
se hace) siempre será la forma más rápida.