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 |
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 |
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 |
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 |
-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 |
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.
Social