Editar la primera línea del archivo de texto grande

16

Tengo un archivo de texto enorme, demasiado grande para que todo se pueda paginar en la memoria. Todo lo que necesito hacer con este archivo de texto es editar la primera línea (es un archivo CSV y necesito alterar los títulos).

¿Hay alguna manera simple de hacer esto en bash?

linces
fuente
¿Hay alguna razón por la que no puedes usar un editor de texto?
dangph
El archivo es demasiado grande, es más de 20 veces más grande que mi memoria virtual máxima en esta máquina.
lincha
1
lo suficientemente justo. Tenía la impresión de que los buenos editores de texto podían manejar archivos muy grandes porque solo se cargaban en la memoria todo lo que necesitaban, pero después de leer algunas de las otras preguntas, parece que la mayoría de ellos tienen problemas con ellos.
dangph
@dangph True ... puede ser extraño, pero algunos "editores de texto" antiguos y obsoletos (o así llamados) como edlinpara ms-dos o edpara Unix no parecían tener este problema, pero solo los editores de línea ... RAM en ¡Estos tiempos eran escasos y preciosos y un tamaño de archivo en Gigabytes era algo imposible de creer! ;)
Laurent
Para dejar las cosas claras;): ¡NO me lo pierdo ed! pero sería una buena opción en este caso (no estoy seguro de que pueda manejar un archivo de este tamaño ...)
Laurent

Respuestas:

22

Puede usar lesspara ver lo que desea editar y usar sedpara hacer los cambios. De esta manera edita sin cargar todo el archivo.

Otra forma es dividir el archivo, editar y volver a unir:

split -b 10000k <file>

and to join:

cat xa* > <file>
Laurent
fuente
voto a favor de sed.
atroon
Fantástico, dividir y unir era exactamente lo que estaba buscando, gracias.
lincha
Claro, sed es mejor ya que puede buscar / reemplazar todo el archivo fácilmente, pero si solo necesita cambiar la primera línea, la división no es mala y más rápida.
Laurent
44
sed habría tardado horas en recorrer todo el archivo (que es un poco menos de media TB), los cambios fueron solo en la primera línea, dividirlo parece razonable.
lincha
3

Si su modificación cambia la longitud de la línea, todo el archivo debe reescribirse, consulte, por ejemplo, esta discusión sobre SO. Probablemente debería considerar guardar los datos en una base de datos.

Teniendo esto en cuenta, puedes editar el archivo con sed. Para reemplazar la primera línea, haga algo como esto (GNU sed):

< oldfile sed '1c\new_heading' > newfile
Thor
fuente