Tengo un problema con la visualización de fragmentos de un archivo de texto muy grande. Este archivo, de aproximadamente 19 GB, es obviamente demasiado grande para verlo por cualquier medio tradicional.
He intentado head 1
y tail 1
( head -n 1
y tail -n 1
) con ambos comandos conectados de varias maneras (para llegar a una pieza en el medio) sin suerte. Mi máquina Linux que ejecuta Ubuntu 9.10 no puede procesar este archivo.
¿Cómo manejo este archivo? Mi objetivo final es afinar las líneas 45000000 y 45000100.
split
hacer que el archivo grande sea más fácil de trabajar.dd
para obtener el bit que busca . Por ejemplodd if=bigfile of=extractfile bs=1M skip=10240 count=5
, extraerá 5 MB del archivo a partir del punto de 10 GB.Respuestas:
Debe utilizar
sed
.Esto le indica
sed
que imprima las líneas 45000000-45000100 inclusive y que salga en la línea 45000101.fuente
tail+|head
es más rápido en un buen 10-15%.Cree una base de datos MySQL con una sola tabla que tenga un solo campo. Luego importe su archivo a la base de datos. Esto hará que sea muy fácil buscar una determinada línea.
No creo que cualquier otra cosa podría ser más rápido (si
head
ytail
no haya superado). Al final, la aplicación que quiere encontrar la línean
tiene que buscar en todo el archivo hasta que encuentren
nuevas líneas. Sin algún tipo de búsqueda (índice de línea para desplazamiento de bytes en el archivo) no se puede lograr un mejor rendimiento.Dado lo fácil que es crear una base de datos MySQL e importar datos en ella, siento que este es un enfoque viable.
Aquí está cómo hacerlo:
/tmp/my_large_file
sería el archivo que quieres leer.La sintaxis correcta para importar un archivo con valores delimitados por tabulaciones en cada línea es:
Otra ventaja importante de esto es que si luego decide extraer otro conjunto de líneas, no tendrá que esperar horas para el procesamiento nuevamente (a menos que elimine la base de datos, por supuesto).
fuente
sed
comando a continuación, e identifiqué mis líneas. Pero ahora tengo una pregunta de seguimiento para la cual el método de base de datos puede ser más adecuado. Ahora necesito eliminar un par de cientos de líneas del archivo.sed
podría hacer eso también. Por supuesto, si tuviera los datos en la base de datos, sería trivial exportar un nuevo archivo con solo las líneas que desea.sed
respuesta (porque me dio un placer más inmediato; -) pero le di un voto positivo porque usaré su método en el futuro. Lo aprecio.FIELDS TERMINATED BY '\n'
a laLOAD DATA
línea.Dos buenas herramientas antiguas para archivos grandes son
join
ysplit
. Puede usar la--lines=<number>
opción dividir con que corta el archivo a varios archivos de cierto tamaño.Por ejemplo
split --lines=45000000 huge_file.txt
. Las partes resultantes estarían en xa, xb, etc. Luego, puedehead
la parte xb que incluiría las líneas que deseaba. También puede 'unir' archivos a un solo archivo grande.fuente
Tiene las herramientas correctas pero las está utilizando incorrectamente. Como se respondió anteriormente en U&L,
tail -n +X file | head -n Y
(tenga en cuenta que+
) es 10-15% más rápido quesed
para las líneas Y que comienzan en X. Y convenientemente, no tiene que explícitamenteexit
el proceso como consed
.fuente