Cuál es una buena forma de extraer, digamos, las líneas 20 a 45 de un archivo de texto enorme. No interactivamente, por supuesto!
command-line
text-processing
Chris Huang-Leaver
fuente
fuente
awk NR==20,NR==45 textfile
funciona también y se lee fácilmente.,
operador de rango de awk .Aún más simple:
El indicador -n deshabilita la salida predeterminada. El "20,45" aborda las líneas 20 a 45, inclusive. El comando "p" imprime la línea actual. Y la q se cierra después de imprimir la línea.
fuente
q
comando (todo a partir de;
) mejoró el rendimiento para mí al extraer una sola línea 26995107 de un archivo de 27169334 líneas.Esta no es una respuesta, pero no puede publicarla como un comentario.
Mikeserv sugirió otra forma (muy rápida) de hacerlo aquí :
Usando el mismo archivo de prueba que aquí y el mismo procedimiento, aquí hay algunos puntos de referencia (líneas de extracción 1000020-1000045):
mikeserv :
Stefan :
Estas son, con mucho, las soluciones más rápidas y las diferencias son insignificantes (para una sola pasada) (intenté con diferentes rangos: un par de líneas, millones de líneas, etc.).
Sin embargo, hacerlo sin la tubería podría ofrecer una ventaja significativa para una aplicación que necesita buscar en múltiples rangos de líneas de manera similar, como:
... que imprime ...
... y solo lee el archivo una vez.
Las otras soluciones
sed
/awk
/perl
leen todo el archivo y, dado que se trata de archivos enormes, no son muy eficientes. Agregué algunas alternativas queexit
oq
uit después de la última línea en el rango especificado:Stefan :
vs.
dkagedal (
sed
):vs.
Steven D :
vs.
fuente
awk NR==1000020,NR==1000045 textfile
en su sistema.fuente
python -c 'import fileinput, sys; [sys.stdout.write(line) for nr, line in enumerate(fileinput.input()) if 19 <= nr <= 44]'
también? :-P Esto es algo que Ruby, inspirado en Perl, inspirado en awk / sed, puede hacer fácilmente.Como sed y awk ya se tomaron, aquí hay una solución perl:
O, como se señala en los comentarios:
fuente
perl -ne'print if 20..45' textfile