GNU/Linux >> Tutoriales Linux >  >> Linux

¿Eliminar eficientemente el primer par de líneas de un archivo de texto?

  • head /tail necesitará iterar casi todo el archivo (dependiendo de la posición de la línea que proporcione como parámetro).
    Luego, copie ese resultado en un archivo nuevo y elimine el anterior.

  • No estoy seguro si sed estará iterando todo el archivo, pero debe copiar ese resultado en un archivo nuevo y eliminar el anterior. Incluso con -i (en su lugar) crea un archivo temporal debajo del capó, por lo que se aplica lo mismo.

¿Por qué no simplemente mover el puntero que apunta a la primera línea del archivo y moverlo a la línea que queremos?

¿Cómo podríamos hacer tal cosa? ¿Tengo que hacerlo en C? ¿Hay otra forma?

Tiene sentido ?? estoy pensando mal? En caso afirmativo, ¿por qué?

Respuesta aceptada:

¿Por qué no simplemente mover el puntero que apunta a la primera línea del archivo y moverlo a la línea que queremos?

Porque no existe tal cosa como un "puntero que apunta a la primera línea del archivo".

Las operaciones básicas para modificar un archivo son:sobrescribir un rango de bytes (es decir, reemplazar una parte con datos de la misma longitud), agregar (es decir, agregar al final), truncar (es decir, eliminar del final).

La mayoría de los sistemas de archivos almacenan archivos en bloques de tamaño fijo, excepto que el último bloque puede ser parcial. No hay forma de modificar los datos en su lugar si la modificación cambiaría el tamaño de lo que se modifica, a menos que el cambio sea al final o la modificación cambiaría los datos por un número entero de bloques. Cambiar datos por un número entero de bloques solo funcionaría por coincidencia, y no existe una interfaz generalizada¹ para hacerlo.

La forma más eficaz de eliminar datos al principio de un archivo es copiar los datos que deben conservarse en un nuevo archivo. Que es precisamente lo que tail -n +42 o sed '41,$p' hacer.

¹ Los sistemas Linux modernos tienen una llamada al sistema para eliminar una parte de un archivo:fallocate(fd, FALLOC_FL_COLLAPSE_RANGE, …) , al que puede llamar a través de la utilidad fallocate --collapse-range=… . También está FALLOC_FL_INSERT_RANGE y --insert-range . Pero están limitados a bloques, lo que los hace en su mayoría inútiles para archivos de texto, y no están disponibles con todos los sistemas de archivos.

Relacionado:¿Cómo obtener el tamaño del encabezado del archivo de la imagen tiff?
Linux
  1. ¿Cómo eliminar líneas duplicadas dentro de un archivo de texto?

  2. ¿Cómo eliminar líneas en blanco de un archivo (incluidos tabuladores y espacios)?

  3. ¿Concatenar líneas basadas en el primer carácter de la siguiente línea?

  4. ¿Cómo eliminar "datos binarios" de un archivo de texto (por ejemplo, Bash_history)?

  5. ¿Eliminar líneas de encabezado adicionales del archivo, excepto la primera línea?

Cómo quitar líneas de un archivo usando el comando Sed

Cómo quitar todos los caracteres de espacio en blanco de un archivo de texto

¿Cómo insertar texto antes de la primera línea de un archivo?

Eliminar líneas vacías en un archivo de texto a través de grep

¿Cómo elimino líneas nuevas de un archivo de texto?

Eliminar las primeras N líneas de un archivo de registro activo