Dividir archivo de texto usando sed

En alguna ocasión he necesitado dividir un archivo de texto plano en varias partes. En un momento dado, por ejemplo, necesitaba copiar a un disco formateado en FAT un archivo con comandos SQL que tenía un tamaño de 6.3 GiB. Como mi disco, formateado en FAT, solo acepta archivos de hasta 4 GiB, es necesario dividir el archivo de texto en dos partes. Decidí usar herramientas sencillas (wc, sed y cat) y evitar usar dd. El comando dd es muy versátil y potente; tan potente que puede causar estragos al más mínimo error (parece que en broma se dice que dd es el acrónimo de «destructor de datos»).

División del archivo

En mi caso sé que casi todas las líneas del archivo de texto tienen la misma longitud. Una forma de dividir el archivo sería introducir la primera mitad de las líneas en un nuevo archivo y la segunda en otro. Primero contamos el número de líneas usando wc:

wc sql_data.sql 
   5557603  455721539 6882254952 sql_data.sql

Se puede ver que el archivo tiene 5.557.603 líneas. Introduciré las 2.800.000 primeras líneas en el primer archivo y el resto en el segundo. Para esto se puede usar sed:

sed -n 1,2800000p sql_data.sql > sql_data1.sql
sed -n 2800001,5557603p sql_data.sql > sql_data2.sql

Para volver a juntar las dos partes se puede usar directamente cat:

cat sql_data1.sql sql_data2.sql > sql_data_check.sql

El resultado final son dos archivos con un tamaño inferior a 4GiB:

-rw-r--r--  1 jsm users 3553315243 Jul 31 12:10 sql_data1.sql
-rw-r--r--  1 jsm users 3328939709 Jul 31 12:12 sql_data2.sql
-rw-r--r--  1 jsm users 6882254952 Jul 31 12:17 sql_data_check.sql
-rw-r--r--  1 jsm users 6882254952 Jul 24 16:19 sql_data.sql

Comprobación

Sí quisiéramos comprobar que todo está bien podemos comparar el hash MD5 del archivo inicial con el del archivo recuperado usando cat:

md5sum sql_data.sql 
  13e934907ab22b8b6e0bd2c1b3bb29d0  sql_data.sql
md5sum sql_data_check.sql
  13e934907ab22b8b6e0bd2c1b3bb29d0  sql_data_check.sql

Como se puede ver los dos archivos tienen el mismo hash, indicándonos (en este caso) que son iguales.

Tags: , , ,

Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.