Comparer deux fichiers sous Linux : guide complet de comm

Introduction

L’analyse différentielle de flux textuels constitue une tâche courante en ingénierie système Linux. Conçu pour traiter deux fichiers préalablement ordonnés, l’utilitaire GNU comm permet d’identifier instantanément leurs éléments communs ainsi que leurs divergences respectives. Ce tutoriel détaille le fonctionnement de son affichage matriciel en trois colonnes, la sélection précise d’ensembles (intersections et disjonctions) via ses indicateurs numériques, ainsi que des techniques d’orchestration avancées adaptées aux environnements de production.

1. Principes fondamentaux de comm et restitution en trois colonnes

Avant toute manipulation, initialisez un environnement de test isolé en exécutant la séquence mkdir -p ~/comm_lab && cd ~/comm_lab.

Initialisation du répertoire d’expérimentation

Générez ensuite le premier fichier d’exemple, fruits_a.txt, contenant une série alphabétique de termes à l’aide de l’instruction printf "apple\nbanana\ncherry\nmango\n" > fruits_a.txt.

Génération du jeu de données fruits_a.txt

Constituez le second fichier comparatif, fruits_b.txt, en lançant la commande printf "banana\ncherry\norange\nwatermelon\n" > fruits_b.txt.

Génération du jeu de données fruits_b.txt

Le programme comm effectue une confrontation ligne par ligne de deux fichiers textuels ordonnés et structure sa sortie standard en trois colonnes distinctes :

  • Colonne 1 (aucun retrait) : regroupe les enregistrements exclusifs au premier fichier.
  • Colonne 2 (indentation simple par tabulation) : rassemble les lignes présentes uniquement dans le second document.
  • Colonne 3 (double tabulation) : met en évidence l’intersection exacte, c’est-à-dire les lignes partagées par les deux sources.

⚙️ [Paramètres essentiels]

-1 : neutralise l’affichage de la colonne 1 (entrées propres au fichier 1).
-2 : supprime la colonne 2 (entrées propres au fichier 2).
-3 : masque la colonne 3 (lignes identiques partagées).
--check-order : s’assure de la stricte conformité du tri lexicographique en entrée.
--nocheck-order : désactive la vérification automatique de l’ordonnancement.
--output-delimiter=STR : remplace le caractère de tabulation par défaut par la chaîne personnalisée STR.

Exécution brute de comm sur deux fichiers

2. Filtrage ensembliste : extraction d’intersections et de différences relatives

Positionnez-vous dans le répertoire de travail via la commande cd ~/comm_lab.

Navigation vers le répertoire de travail

L’invocation de comm -12 inhibe simultanément les première et deuxième colonnes, ne conservant que les éléments partagés par les deux jeux de données.
Le terminal renvoie ici les valeurs banana et cherry, illustrant parfaitement l’intersection ensembliste.

Extraction des lignes communes avec comm -12

À l’inverse, l’exécution de comm -23 supprime les colonnes 2 et 3, révélant la différence relative du premier ensemble par rapport au second.
La commande isole ainsi les entrées apple et mango, qui n’appartiennent qu’au conteneur fruits_a.txt.

Isolement des lignes uniques du premier fichier avec comm -23

En sollicitant l’option comm -13, les flux 1 et 3 se trouvent masqués au profit des composantes exclusives au second fichier.
La console restitue alors orange et watermelon, spécifiques à fruits_b.txt.

Isolement des lignes uniques du second fichier avec comm -13

3. Traitement de données non triées via la substitution de processus Bash

Repositionnez le contexte d’exécution au sein du dossier laboratoire grâce à cd ~/comm_lab.

Positionnement dans le dossier d’expérimentation

Pour observer le comportement sur des corpus non ordonnés, créez le premier fichier source unsorted_a.txt en invoquant printf "zebra\napple\ngrape\n" > unsorted_a.txt.

Création d’un premier fichier non ordonné

Créez dans la foulée le fichier unsorted_b.txt par le biais de l’instruction printf "apple\norange\nzebra\n" > unsorted_b.txt.

Création d’un second fichier non ordonné

L’expression comm <(sort unsorted_a.txt) <(sort unsorted_b.txt) exploite la substitution de processus du shell (<(...)). Cette construction évite l’écriture de fichiers intermédiaires sur le disque en triant les flux à la volée avant de les injecter directement dans les descripteurs de comm.
L’analyse génère la répartition attendue : grape en colonne 1, orange en colonne 2, puis apple et zebra dans la colonne des éléments communs.

Comparaison à la volée via la substitution de processus

L’adjonction de l’argument -12 sous la forme comm -12 <(sort unsorted_a.txt) <(sort unsorted_b.txt) affine le filtrage en retenant uniquement les correspondances croisées.
Sans avoir recours à aucun fichier temporaire, les données redondantes apple et zebra sont extraites proprement d’un simple appel.

Filtrage de l’intersection de flux triés dynamiquement

4. Cas pratiques : audit de paquets système et gestion de la casse

Rejoignez de nouveau l’espace de test avec la commande cd ~/comm_lab.

Accès au répertoire de travail

Simulez l’inventaire logiciel d’un premier serveur en créant server1_pkgs.txt via l’instruction printf "curl\ngit\nnginx\nvim\n" > server1_pkgs.txt.

Inventaire des paquets du serveur 1

Matérialisez la configuration d’un second nœud d’infrastructure dans server2_pkgs.txt en exécutant printf "docker\ngit\npython3\nvim\n" > server2_pkgs.txt.

Inventaire des paquets du serveur 2

La directive comm -3 server1_pkgs.txt server2_pkgs.txt occulte délibérément la colonne des dépendances communes pour mettre en lumière les disparités d’installation entre les deux machines.
Les utilitaires mutualisés git et vim sont ignorés, laissant apparaître d’un côté les paquets exclusifs à l’hôte 1 (curl, nginx) et de l’autre ceux propres à l’hôte 2 (docker, python3).

Audit différentiel de parcs de paquets

Afin d’étudier l’influence des variations de casse typographique, générez le fichier mixed_a.txt via la commande printf "Apple\nBANANA\ncherry\n" > mixed_a.txt.

Production d’un échantillon à casse mixte A

Établissez ensuite l’échantillon antagoniste mixed_b.txt au moyen de printf "apple\nbanana\nCHERRY\n" > mixed_b.txt.

Production d’un échantillon à casse mixte B

La commande comm -12 --nocheck-order <(sort -f mixed_a.txt) <(sort -f mixed_b.txt) combine un tri insensible à la casse (sort -f) avec le drapeau --nocheck-order, indispensable pour empêcher comm d’interrompre son traitement face à un ordre non conventionnel de ses entrées.
Néanmoins, comme comm opère une comparaison binaire rigoureuse au niveau des octets, les divergences de majuscules empêchent toute correspondance exacte : la commande s’achève donc sans renvoyer la moindre ligne.

Vérification de sensibilité à la casse avec comm

Vous disposez désormais d’une vision approfondie des mécanismes de l’utilitaire comm pour segmenter, rapprocher ou isoler des jeux d’enregistrements sous Linux.
En associant judicieusement le tri préalable aux options d’exclusion de colonnes, vous automatiserez avec une efficacité redoutable vos audits d’inventaires, vos vérifications de configurations et vos diagnostics de journaux d’événements.