¿Una forma eficiente de imprimir líneas desde un archivo masivo usando awk, sed u otra cosa?

¿Una forma eficiente de imprimir líneas desde un archivo masivo usando awk, sed u otra cosa?

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 tailo headen 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

tailDe 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 tailque 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 headimprimirá 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 tailse hace) siempre será la forma más rápida.

información relacionada