Muchas veces puede tener varios archivos que necesita fusionar en un solo archivo. Podría ser que usted previamente dividido un solo archivo en varios archivos, y quiere simplemente fusionar de nuevo o tiene varios archivos de registro que desea fusionado en uno. Cualquiera que sea la razón, es muy fácil fusionar múltiples archivos de texto en un solo archivo en Linux.
El comando en Linux para concatenar o fusionar múltiples archivos en un solo archivo se llama cat. El comando cat por defecto concatenará e imprimirá múltiples archivos a la salida estándar. Puede redirigir la salida estándar a un archivo utilizando el operador ‘>’ para guardar la salida en el disco o en el sistema de archivos.
Otra utilidad útil para fusionar archivos se llama join que puede unir líneas de dos archivos basándose en campos comunes. Sin embargo, sólo puede trabajar en dos archivos a la vez, y he encontrado que es bastante engorroso de usar. Cubriremos principalmente el comando cat en este post.
Fusionar varios archivos en uno en orden
El comando cat toma una lista de nombres de archivos como argumento. El orden en el que se especifican los nombres de los archivos en la línea de comandos dicta el orden en el que se fusionan o combinan los archivos. Así, si tiene varios archivos llamados archivo1.txt, archivo2.txt, archivo3.txt, etc…
bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt
El comando anterior añadirá el contenido de archivo2.txt al final de archivo1.txt. El contenido de archivo3.txt se añade al final del contenido fusionado de archivo1.txt y archivo2.txt y así sucesivamente… y todo el archivo fusionado se guarda con el nombre archivofusionado.txt en el directorio de trabajo actual.
Muchas veces, puede tener un número excesivo de archivos que hace más difícil escribir todos los nombres de los archivos. El comando cat acepta expresiones regulares como nombres de archivos de entrada, lo que significa que puede utilizarlas para reducir el número de argumentos.
bash$ cat file*.txt my*.txt > mergedfile.txt
Esto fusionará todos los archivos en el directorio actual que comienzan con el nombre archivo y tiene una extensión txt seguido de los archivos que comienzan con mi y tiene una extensión txt. Tienes que tener cuidado con el uso de expresiones regulares, si quieres preservar el orden de los archivos. Si la expresión regular es incorrecta, afectará al orden exacto en el que se combinan los archivos.
Una forma rápida y sencilla de asegurarse de que los archivos se combinan en el orden exacto que desea, es utilizar la salida de otro programa de listado de archivos como ls o find y canalizarla al comando cat. Primero ejecute el comando find con la expresión regular y verifique el orden de los archivos…
bash$ find . -name "file*.txt" -o -name "my*.txt"
Esto imprimirá los archivos en orden de manera que pueda verificar que es correcto o modificarlo para que coincida con lo que desea. A continuación, puede canalizar esa salida en el comando cat.
bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
Cuando fusiona varios archivos en uno solo utilizando expresiones regulares para hacerlos coincidir, especialmente cuando se canaliza y cuando el archivo de salida no es muy obvio, asegúrese de que la expresión regular no coincide con el nombre del archivo fusionado. En el caso de que sí coincida, normalmente el comando cat es bastante bueno a la hora de dar un error con el mensaje «el archivo de entrada es el archivo de salida». Pero ayuda a tener cuidado para empezar.
Fusionar dos archivos en una ubicación arbitraria
A veces puede querer fusionar dos archivos, pero en una ubicación particular dentro del contenido de un archivo. Esto es más como el proceso de insertar el contenido de un archivo en otro en una posición particular en el archivo.
Si el tamaño de los archivos es pequeño y manejable, entonces vi es una gran herramienta de edición para hacer esto. De lo contrario, la opción es dividir el archivo primero y luego fusionar los archivos resultantes en orden. La forma más fácil es dividir el archivo se basa en los números de línea, exactamente en el lugar donde desea insertar el otro archivo.
bash$ split -l 1234 file1.txt
Usted puede dividir el archivo en cualquier número de archivos de salida en función de su necesidad. El ejemplo anterior dividirá el archivo file1.txt en trozos de 1234 líneas. Es muy posible que termine con más de dos archivos, llamados xaa, xab, xac, etc. Puede combinarlos todos de nuevo utilizando el mismo comando cat mencionado anteriormente.
bash$ cat xaa file2.txt xa{b..z}
El comando anterior combinará los archivos en orden con el contenido de archivo2.txt entre el contenido de xaa y xab.
Otro caso de uso es cuando necesita combinar sólo partes específicas de ciertos archivos dependiendo de alguna condición. Esto es especialmente útil para mí cuando tengo que analizar varios archivos de registro grandes, pero sólo estoy interesado en ciertos mensajes o líneas. Por lo tanto, necesitaré extraer los mensajes de registro importantes basados en algún criterio de varios archivos de registro y guardarlos en un archivo diferente mientras también se mantiene o preserva el orden de los mensajes.
Aunque puedes hacer esto usando los comandos cat y grep, también puedes hacerlo sólo con el comando grep.
bash$ grep -h "" logfile*.log > onlyerrors.log
Lo anterior extraerá todas las líneas que coincidan con el patrón y lo guardará en otro archivo. Tendrás que asegurarte de que los archivos de registro están en orden cuando utilices la expresión regular para hacerlos coincidir, como se mencionó anteriormente en el post.