Tengo un archivo muy grande (~ 400 GB) y necesito eliminar las últimas 2 líneas. Traté de usarlo sed
, pero funcionó durante horas antes de rendirme. ¿Hay alguna forma rápida de hacer esto o estoy atascado sed
?
linux
sed
text-manipulation
Russ Bradberry
fuente
fuente
head -n -2 file
Respuestas:
No he probado esto en un archivo grande para ver qué tan rápido es, pero debería ser bastante rápido.
Para usar el script para eliminar líneas del final de un archivo:
Busca hasta el final del archivo, verifica para asegurarse de que el último carácter sea una nueva línea, luego lee cada carácter uno a la vez retrocediendo hasta encontrar tres nuevas líneas y trunca el archivo justo después de ese punto. El cambio se realiza en su lugar.
Editar: he agregado una versión de Python 2.4 en la parte inferior.
Aquí hay una versión para Python 2.5 / 2.6:
Aquí hay una versión de Python 3:
Aquí hay una versión de Python 2.4:
fuente
puedes probar GNU head
fuente
head: illegal line count -- -2
Veo que mis sistemas Debian Squeeze / testing (pero no Lenny / stable) incluyen un comando "truncar" como parte del paquete "coreutils".
Con él simplemente podrías hacer algo como
para eliminar 160 bytes del final del archivo (obviamente, necesita averiguar exactamente cuántos caracteres necesita eliminar).
fuente
dd
script simple lo hará (debe especificar el desplazamiento de entrada para obtener el último kilobyte y luego usartail -2 | LANG= wc -c
, o algo así).tail
también es eficiente para archivos grandes; puede usarsetail | wc -c
para calcular el número de bytes que se van a recortar.El problema con sed es que es un editor de flujo: procesará todo el archivo incluso si solo desea realizar modificaciones cerca del final. Así que no importa qué, está creando un nuevo archivo de 400 GB, línea por línea. Cualquier editor que opere en todo el archivo probablemente tendrá este problema.
Si conoce el número de líneas, puede usar
head
, pero nuevamente esto crea un nuevo archivo en lugar de alterar el existente en su lugar. Supongo que puede obtener ganancias de velocidad por la simplicidad de la acción.Es posible que tenga más suerte usando
split
para dividir el archivo en partes más pequeñas, editando el último y luego usandocat
para combinarlas nuevamente, pero no estoy seguro de si será mejor. Usaría recuentos de bytes en lugar de líneas, de lo contrario, probablemente no será más rápido en absoluto: todavía va a crear un nuevo archivo de 400 GB.fuente
Pruebe VIM ... No estoy seguro de si funcionará o no, ya que nunca lo he usado en un archivo tan grande, pero lo he usado en archivos más pequeños y más grandes en el pasado, inténtelo.
fuente
¿Qué tipo de archivo y en qué formato? Puede ser más fácil usar algo como Perl dependiendo de qué tipo de archivo sea: ¿texto, gráficos, binario? Cómo se formatea: CSV, TSV ...
fuente
Si conoce el tamaño del archivo hasta el byte (por ejemplo, 400000000160) y sabe que necesita eliminar exactamente 160 caracteres para quitar las dos últimas líneas, entonces algo como
debería hacer el truco. Sin embargo, han pasado años desde que usé dd con ira; Parece que recuerdo que las cosas van más rápido si usas un tamaño de bloque más grande, pero si puedes hacerlo depende de si las líneas que quieres soltar son un buen múltiplo.
dd tiene algunas otras opciones para rellenar registros de texto a un tamaño fijo que podría ser útil como pase preliminar.
fuente
Si el comando "truncar" no está disponible en su sistema (vea mi otra respuesta), mire el "truncamiento de man 2" para la llamada del sistema para truncar un archivo a una longitud especificada.
Obviamente, necesita saber cuántos caracteres necesita para truncar el archivo (tamaño menos la longitud del problema dos líneas; no olvide contar los caracteres cr / lf).
¡Y haga una copia de seguridad del archivo antes de intentar esto!
fuente
Si prefiere soluciones de estilo unix, puede guardar y truncar líneas interactivas utilizando tres líneas de código (Probado en Mac y Linux).
truncamiento de línea de estilo Unix pequeño + seguro (pide confirmación):
Esta solución se basa en algunas herramientas comunes de Unix, pero aún se utiliza
perl -e "truncate(file,length)"
como el reemplazo más cercano paratruncate(1)
, que no está disponible en todos los sistemas.También puede usar el siguiente programa integral de shell reutilizable, que proporciona información de uso y cuenta con confirmación de truncamiento, análisis de opciones y manejo de errores.
secuencia de comandos de truncamiento de línea integral :
Aquí hay un ejemplo de uso:
fuente
Los cambios se realizan en su lugar. Esto es más simple y más eficiente que el script python.
fuente
ed
tardó 100 veces más en ejecutarse que mi script Python. Solo puedo imaginar cuánto más sería la diferencia para el archivo del OP, que es 7000 veces más grande.Modificó la respuesta aceptada para resolver un problema similar. Podría modificarse un poco para eliminar n líneas.
Y la prueba correspondiente:
fuente
Puede usar Vim en modo Ex:
-,
seleccione las últimas 2 líneasd
borrarx
guardar y cerrarfuente