Fusionar y ordenar archivos en Linux

, Author

Hay varias formas de fusionar y ordenar archivos de texto en Linux, pero la forma de hacerlo depende de lo que estés tratando de lograr – si simplemente quieres poner el contenido de varios archivos en un archivo grande, o organizarlo de alguna manera que haga más fácil su uso. En este post, veremos algunos comandos para ordenar y combinar el contenido de los archivos y nos centraremos en cómo difieren los resultados.

Usando cat

Si todo lo que quieres hacer es juntar un grupo de archivos en un solo archivo, el comando cat es una opción fácil. Todo lo que tiene que hacer es teclear «cat» y luego listar los archivos en la línea de comandos en el orden en que quiere que se incluyan en el archivo fusionado. Redirige la salida del comando al archivo que quieres crear. Si ya existe un archivo con el nombre especificado, será sobrescrito por el que está creando. Por ejemplo:

$ cat firstfile secondfile thirdfile > newfile

Si quiere añadir el contenido de una serie de archivos a un archivo existente en lugar de sobrescribirlo, sólo tiene que cambiar el > por >>.

$ cat firstfile secondfile thirdfile >> updated_file

Si los archivos que está fusionando siguen alguna convención de nomenclatura conveniente, la tarea puede ser aún más sencilla. No tendrá que incluir todos los nombres de los archivos si puede especificarlos mediante una expresión regular. Por ejemplo, si todos los archivos terminan con la palabra «archivo» como en el ejemplo anterior, podría hacer algo como esto:

$ cat *file > allfiles

Note que el comando mostrado arriba agregará el contenido de los archivos en orden alfanumérico. En Linux, un archivo llamado «filea» se añadiría antes de uno llamado «fileA», pero después de uno llamado «file7». Después de todo, no sólo tenemos que pensar en «ABCDE» cuando se trata de una secuencia alfanumérica; tenemos que pensar en «0123456789aAbBcCdDeE». Siempre puede utilizar un comando como «ls *file» para ver el orden en el que se añadirán los archivos antes de fusionarlos.

NOTA: Es una buena idea asegurarse primero de que su comando incluye todos los archivos que quiere en el archivo fusionado y no otros – especialmente cuando está utilizando un comodín como «*». Y no olvide que los archivos fusionados seguirán existiendo como archivos separados, que puede querer eliminar una vez que se haya verificado la fusión.

Fusión de archivos por edad

Si quiere fusionar sus archivos basándose en la edad de cada uno de ellos en lugar de por los nombres de los archivos, utilice un comando como éste:

$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done

Usando las opciones -tr (t=tiempo, r=inverso) obtendrá una lista de archivos en orden de antigüedad. Esto puede ser útil, por ejemplo, si está manteniendo un registro de ciertas actividades y quiere que el contenido se agregue en el orden en que se realizaron las actividades.

El $$ en el comando anterior representa el ID del proceso para el comando cuando lo ejecuta. Es completamente innecesario usarlo, pero hace casi imposible que se añada inadvertidamente al final de un archivo existente en lugar de crear uno nuevo. Si utiliza $$, el archivo resultante podría tener este aspecto:

$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914

Fusión y ordenación de archivos

Linux proporciona algunas formas interesantes de ordenar el contenido de los archivos antes o después de la fusión.

Ordenar el contenido alfabéticamente

Si quiere que el contenido del archivo fusionado esté ordenado, puede ordenar el contenido global con un comando como este:

$ cat myfile.1 myfile.2 myfile.3 | sort > newfile

Si quiere mantener el contenido agrupado por archivo, ordene cada archivo antes de añadirlo al nuevo con un comando como este:

$ for file in `ls myfile.?`; do sort $file >> newfile; done

Ordenar los archivos numéricamente

Para ordenar el contenido de los archivos numéricamente, utilice la opción -n con sort. Esta opción es útil sólo si las líneas de sus archivos comienzan con números. Tenga en cuenta que, en el orden por defecto, «02» se consideraría más pequeño que «1». Utilice la opción -n cuando quiera asegurarse de que las líneas se ordenan en orden numérico.

$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz

La opción -n también le permite ordenar el contenido de los archivos por fecha si las líneas de los archivos comienzan con fechas en un formato como «2020-11-03» o «2020/11/03» (formato de año, mes, día). La ordenación por fechas en otros formatos será complicada y requerirá comandos mucho más complejos.

Usando pegar

El comando pegar le permite unir el contenido de los archivos línea por línea. Cuando se utiliza este comando, la primera línea del archivo fusionado contendrá la primera línea de cada uno de los archivos que se están fusionando. He aquí un ejemplo en el que he utilizado letras mayúsculas para que sea fácil ver de dónde proceden las líneas:

$ cat file.aA oneA twoA three$ paste file.a file.b file.cA one B one C oneA two B two C twoA three B three C thee B four C four C five

Dirige la salida a otro archivo para guardarla:

$ paste file.a file.b file.c > merged_content

Alternamente, puedes pegar archivos de forma que el contenido de cada uno de ellos se una en una sola línea. Esto requiere el uso de la opción -s (secuencial). Observe cómo la salida esta vez muestra el contenido de cada archivo:

$ paste -s file.a file.b file.cA one A two A threeB one B two B three B fourC one C two C thee C four C five

Usando join

Otro comando para fusionar archivos es join. El comando join permite fusionar el contenido de varios archivos basándose en un campo común. Por ejemplo, puede tener un archivo que contenga los números de teléfono de un grupo de compañeros de trabajo y otro que contenga sus direcciones de correo electrónico personales y ambos estén listados por los nombres de las personas. Puede utilizar join para crear un archivo con los números de teléfono y las direcciones de correo electrónico.

Una restricción importante es que los archivos deben tener sus líneas listadas en el mismo orden e incluir el campo join en cada archivo.

Aquí tiene un comando de ejemplo:

$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]

En este ejemplo, el primer campo (nombres) debe existir en cada archivo aunque falte la información adicional o el comando fallará con un error. Ordenar el contenido es útil y probablemente mucho más fácil de manejar, pero no es necesario siempre que el orden sea consistente.

Recoger

En Linux tiene muchas opciones para combinar y ordenar los datos almacenados en archivos separados. Las opciones pueden hacer que algunas tareas de otro modo tediosas sean sorprendentemente fáciles.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.