Il existe un certain nombre de façons de fusionner et de trier des fichiers texte sous Linux, mais la façon de procéder dépend de ce que vous essayez d’accomplir – si vous voulez simplement mettre le contenu de plusieurs fichiers dans un seul gros fichier, ou l’organiser d’une manière qui le rend plus facile à utiliser. Dans ce post, nous allons examiner certaines commandes pour trier et fusionner le contenu des fichiers et nous concentrer sur la façon dont les résultats diffèrent.
Utiliser cat
Si tout ce que vous voulez faire est de tirer un groupe de fichiers ensemble dans un seul fichier, la commande cat est un choix facile. Tout ce que vous avez à faire est de taper « cat », puis de lister les fichiers sur la ligne de commande dans l’ordre dans lequel vous voulez qu’ils soient inclus dans le fichier fusionné. Redirigez la sortie de la commande vers le fichier que vous voulez créer. Si un fichier portant le nom spécifié existe déjà, il sera écrasé par celui que vous créez. Par exemple :
$ cat firstfile secondfile thirdfile > newfile
Si vous voulez ajouter le contenu d’une série de fichiers à un fichier existant plutôt que de l’écraser, changez simplement le > en >>.
$ cat firstfile secondfile thirdfile >> updated_file
Si les fichiers que vous fusionnez suivent une convention de dénomination pratique, la tâche peut être encore plus simple. Vous n’aurez pas à inclure tous les noms de fichiers si vous pouvez les spécifier à l’aide d’une expression régulière. Par exemple, si les fichiers se terminent tous par le mot « file » comme dans l’exemple ci-dessus, vous pouvez faire quelque chose comme ceci:
$ cat *file > allfiles
Notez que la commande présentée ci-dessus ajoutera le contenu des fichiers dans l’ordre alphanumérique. Sous Linux, un fichier nommé « filea » serait ajouté avant un fichier nommé « fileA », mais après un fichier nommé « file7 ». Après tout, il ne suffit pas de penser « ABCDE » lorsque l’on a affaire à une séquence alphanumérique ; il faut aussi penser « 0123456789aAbBcCdDeE ». Vous pouvez toujours utiliser une commande comme « ls *file » pour voir l’ordre dans lequel les fichiers seront ajoutés avant de fusionner les fichiers.
NOTE : C’est une bonne idée de s’assurer d’abord que votre commande inclut tous les fichiers que vous voulez dans le fichier fusionné et aucun autre – surtout quand vous utilisez un joker comme « * ». Et n’oubliez pas que les fichiers fusionnés existeront toujours en tant que fichiers séparés, que vous pourriez vouloir supprimer une fois la fusion vérifiée.
Fusion de fichiers par âge
Si vous voulez fusionner vos fichiers en fonction de l’âge de chaque fichier plutôt que par les noms de fichiers, utilisez une commande comme celle-ci :
$ for file in `ls -tr myfile.*`; do cat $file >> BigFile.$$; done
L’utilisation des options -tr (t=time, r=reverse) donnera une liste de fichiers dans l’ordre d’âge le plus ancien d’abord. Cela peut être utile, par exemple, si vous tenez un journal de certaines activités et que vous voulez que le contenu soit ajouté dans l’ordre dans lequel les activités ont été réalisées.
Le $$ dans la commande ci-dessus représente l’ID du processus pour la commande lorsque vous l’exécutez. Il est totalement inutile de l’utiliser, mais cela rend presque impossible que vous ajoutiez par inadvertance à la fin d’un fichier existant au lieu d’en créer un nouveau. Si vous utilisez $$, le fichier résultant pourrait ressembler à ceci:
$ ls -l BigFile.*-rw-rw-r-- 1 justme justme 931725 Aug 6 12:36 BigFile.582914
Fusion et tri des fichiers
Linux fournit quelques moyens intéressants de trier le contenu des fichiers avant ou après la fusion.
Tri du contenu par ordre alphabétique
Si vous voulez que le contenu du fichier fusionné soit trié, vous pouvez trier le contenu global avec une commande comme celle-ci:
$ cat myfile.1 myfile.2 myfile.3 | sort > newfile
Si vous voulez garder le contenu groupé par fichier, triez chaque fichier avant de l’ajouter au nouveau fichier avec une commande comme celle-ci:
$ for file in `ls myfile.?`; do sort $file >> newfile; done
Tri des fichiers numériquement
Pour trier le contenu des fichiers numériquement, utilisez l’option -n avec sort. Cette option n’est utile que si les lignes de vos fichiers commencent par des chiffres. Gardez à l’esprit que, dans l’ordre par défaut, « 02 » serait considéré comme plus petit que « 1 ». Utilisez l’option -n lorsque vous voulez vous assurer que les lignes sont triées par ordre numérique.
$ cat myfile.1 myfile.2 myfile.3 | sort -n > xyz
L’option -n vous permet également de trier le contenu des fichiers par date si les lignes des fichiers commencent par des dates dans un format comme « 2020-11-03 » ou « 2020/11/03 » (format année, mois, jour). Le tri par dates dans d’autres formats sera délicat et nécessitera des commandes beaucoup plus complexes.
Utilisation de paste
La commande paste vous permet de joindre le contenu des fichiers sur une base ligne par ligne. Lorsque vous utilisez cette commande, la première ligne du fichier fusionné contient la première ligne de chacun des fichiers fusionnés. Voici un exemple dans lequel j’ai utilisé des lettres majuscules pour qu’il soit facile de voir d’où viennent les lignes:
$ 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
Rediriger la sortie vers un autre fichier pour l’enregistrer:
$ paste file.a file.b file.c > merged_content
Alternativement, vous pouvez coller des fichiers ensemble de sorte que le contenu de chaque fichier soit joint en une seule ligne. Cela nécessite l’utilisation de l’option -s (séquentiel). Remarquez comment la sortie montre cette fois le contenu de chaque fichier:
$ 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
Utilisation de join
Une autre commande pour fusionner des fichiers est join. La commande join vous permet de fusionner le contenu de plusieurs fichiers en fonction d’un champ commun. Par exemple, vous pouvez avoir un fichier qui contient les numéros de téléphone d’un groupe de collègues de travail et un autre qui contient leurs adresses électroniques personnelles et ils sont tous deux répertoriés par les noms des individus. Vous pouvez utiliser la jointure pour créer un fichier contenant à la fois les numéros de téléphone et les adresses électroniques.
Une restriction importante est que les fichiers doivent avoir leurs lignes listées dans le même ordre et inclure le champ de jointure dans chaque fichier.
Voici un exemple de commande :
$ join phone_numbers email_addressesSandra 555-456-1234 [email protected] 555-540-5405John 555-333-1234 [email protected] 555-123-4567 [email protected]
Dans cet exemple, le premier champ (prénoms) doit exister dans chaque fichier même si les informations supplémentaires sont manquantes ou la commande échouera avec une erreur. Le tri du contenu est utile et probablement beaucoup plus facile à gérer, mais n’est pas nécessaire tant que l’ordre est cohérent.
Wrap-Up
Vous avez beaucoup d’options sur Linux pour fusionner et trier les données stockées dans des fichiers séparés. Ces choix peuvent rendre certaines tâches autrement fastidieuses étonnamment faciles.