Plusieurs fois, vous pouvez avoir plusieurs fichiers qui doivent être fusionnés en un seul fichier. Il se peut que vous ayez précédemment divisé un fichier unique en plusieurs fichiers et que vous vouliez simplement les fusionner à nouveau ou que vous ayez plusieurs fichiers journaux que vous voulez fusionner en un seul. Quelle que soit la raison, il est très facile de fusionner plusieurs fichiers texte en un seul fichier sous Linux.
La commande sous Linux pour concaténer ou fusionner plusieurs fichiers en un seul fichier est appelée cat. La commande cat par défaut concaténera et imprimera plusieurs fichiers sur la sortie standard. Vous pouvez rediriger la sortie standard vers un fichier en utilisant l’opérateur ‘>’ pour enregistrer la sortie sur le disque ou le système de fichiers.
Un autre utilitaire utile pour fusionner des fichiers est appelé join qui peut joindre les lignes de deux fichiers sur la base de champs communs. Il ne peut cependant travailler que sur deux fichiers à la fois, et j’ai trouvé qu’il était assez lourd à utiliser. Nous couvrirons principalement la commande cat dans ce post.
Fusionner plusieurs fichiers en un seul dans l’ordre
La commande cat prend une liste de noms de fichiers comme argument. L’ordre dans lequel les noms de fichiers sont spécifiés dans la ligne de commande dicte l’ordre dans lequel les fichiers sont fusionnés ou combinés. Ainsi, si vous avez plusieurs fichiers nommés fichier1.txt, fichier2.txt, fichier3.txt etc…
bash$ cat file1.txt file2.txt file3.txt file4.txt > ./mergedfile.txt
La commande ci-dessus ajoutera le contenu de fichier2.txt à la fin de fichier1.txt. Le contenu de file3.txt est ajouté à la fin du contenu fusionné de file1.txt et file2.txt et ainsi de suite…et l’ensemble du fichier fusionné est enregistré avec le nom mergedfile.txt dans le répertoire de travail actuel.
Plusieurs fois, vous pouvez avoir un nombre démesuré de fichiers qui rend difficile la saisie de tous les noms de fichiers. La commande cat accepte les expressions régulières comme noms de fichiers en entrée, ce qui signifie que vous pouvez les utiliser pour réduire le nombre d’arguments.
bash$ cat file*.txt my*.txt > mergedfile.txt
Ceci fusionnera tous les fichiers du répertoire actuel qui commencent par le nom fichier et a une extension txt suivi des fichiers qui commencent par mon et a une extension txt. Vous devez faire attention à l’utilisation des expressions régulières, si vous voulez préserver l’ordre des fichiers. Si vous vous trompez dans l’expression régulière, cela affectera l’ordre exact dans lequel les fichiers sont fusionnés.
Une façon rapide et facile de s’assurer que les fichiers sont fusionnés dans l’ordre exact que vous voulez, est d’utiliser la sortie d’un autre programme de liste de fichiers tel que ls ou find et de la passer à la commande cat. Exécutez d’abord la commande find avec l’expression régulière et vérifiez l’ordre des fichiers…
bash$ find . -name "file*.txt" -o -name "my*.txt"
Ceci imprimera les fichiers dans un ordre tel que vous pourrez vérifier qu’il est correct ou le modifier pour qu’il corresponde à ce que vous voulez. Vous pouvez ensuite acheminer cette sortie dans la commande cat.
bash$ find . -name "file*.txt" -o -name "my*.txt" | xargs cat > ./mergedfile.txt
Lorsque vous fusionnez plusieurs fichiers en un seul en utilisant des expressions régulières pour les faire correspondre, en particulier lorsqu’il est acheminé par pipeline et que le fichier de sortie n’est pas très évident, assurez-vous que l’expression régulière ne correspond pas au nom de fichier du fichier fusionné. Dans le cas où elle correspond, la commande cat est généralement assez bonne pour se tromper avec le message « input file is output file ». Mais cela aide d’être prudent pour commencer.
Fusionner deux fichiers à un emplacement arbitraire
Parfois, vous pourriez vouloir fusionner deux fichiers, mais à un emplacement particulier dans le contenu d’un fichier. Cela ressemble plus au processus d’insertion du contenu d’un fichier dans un autre à une position particulière dans le fichier.
Si la taille des fichiers est petite et gérable, alors vi est un excellent outil d’édition pour faire cela. Sinon, l’option est de diviser le fichier d’abord et ensuite de fusionner les fichiers résultants dans l’ordre. La façon la plus simple est de diviser le fichier est basée sur les numéros de ligne, exactement à l’endroit où vous voulez insérer l’autre fichier.
bash$ split -l 1234 file1.txt
Vous pouvez diviser le fichier en un nombre quelconque de fichiers de sortie en fonction de votre exigence. L’exemple ci-dessus divisera le fichier file1.txt en morceaux de 1234 lignes. Il est tout à fait possible que vous vous retrouviez avec plus de deux fichiers, nommés xaa, xab, xac etc…Vous pouvez tout fusionner à nouveau en utilisant la même commande cat que celle mentionnée précédemment.
bash$ cat xaa file2.txt xa{b..z}
La commande ci-dessus fusionnera les fichiers dans l’ordre avec le contenu de file2.txt entre le contenu de xaa et xab.
Un autre cas d’utilisation est lorsque vous avez besoin de fusionner seulement des parties spécifiques de certains fichiers en fonction d’une certaine condition. C’est particulièrement utile pour moi lorsque je dois analyser plusieurs gros fichiers journaux, mais que je ne suis intéressé que par certains messages ou certaines lignes. Ainsi, j’aurai besoin d’extraire les messages de journal importants basés sur certains critères de plusieurs fichiers de journal et de les enregistrer dans un fichier différent tout en maintenant ou préservant l’ordre des messages.
Bien que vous puissiez faire cela en utilisant les commandes cat et grep, vous pouvez également le faire avec juste la commande grep.
bash$ grep -h "" logfile*.log > onlyerrors.log
La commande ci-dessus extraira toutes les lignes qui correspondent au motif et l’enregistrera dans un autre fichier. Vous devrez vous assurer que les fichiers journaux sont dans l’ordre lorsque vous utilisez l’expression régulière pour les faire correspondre, comme mentionné plus haut dans le post.