Débutant

Maîtriser comm, join et diff pour comparer deux fichiers texte sous Linux

Apprenez à utiliser comm, join et diff pour comparer deux fichiers texte, repérer les écarts et produire des rapports utiles en ligne de commande.

Maîtriser comm, join et diff pour comparer deux fichiers texte sous Linux
Difficulté
Facile

Pour comparer deux fichiers texte en ligne de commande, retenez trois outils : comm pour les lignes communes ou absentes, join pour fusionner des données sur une clé, et diff pour afficher les changements précis. Le bon choix dépend surtout de la structure des fichiers et du type de rapport attendu.

Ce guide montre quand utiliser chaque commande, comment préparer les fichiers, puis comment produire un résultat lisible et enregistrable. Les exemples restent en texte brut pour être reproductibles sur la plupart des systèmes Linux.

Prérequis

Vous avez besoin d'un terminal Linux et de deux fichiers texte à comparer. Les commandes présentées font partie des outils GNU ou POSIX courants, mais certaines options peuvent varier selon le système.

Pour les exemples avec comm et join, les fichiers doivent être triés selon la clé utilisée. Vérifiez toujours ce point avant d'interpréter le résultat.

Matériel nécessaire

  • Un terminal Linux
  • Deux fichiers texte de test
  • Les commandes sort, comm, join et diff

Étapes

  1. Préparer deux fichiers comparables

    Commencez par vérifier la structure de vos fichiers : une ligne par valeur pour comm, une clé en début de ligne pour join, et n'importe quel texte ligne à ligne pour diff. Si l'ordre n'a pas de sens métier, triez d'abord les fichiers pour éviter des écarts trompeurs.

    Exemple de préparation :

    sort fichierA.txt > fichierA.sorted.txt
    sort fichierB.txt > fichierB.sorted.txt
  2. Lister les lignes communes et différentes avec comm

    Écran d’ordinateur et clavier sur un bureau simple, avec une session de terminal affichant la comparaison de deux fichiers texte en colonnes, mettant en évidence des lignes communes et différentes.

    Utilisez comm si vous voulez savoir quelles lignes n'existent que dans le premier fichier, que dans le second, ou dans les deux. La sortie est répartie en trois colonnes, selon le manuel GNU Coreutils.

    comm fichierA.sorted.txt fichierB.sorted.txt

    Pour n'afficher que les lignes propres au premier fichier, masquez les colonnes 2 et 3 :

    comm -23 fichierA.sorted.txt fichierB.sorted.txt

    Pour n'afficher que les lignes communes :

    comm -12 fichierA.sorted.txt fichierB.sorted.txt
  3. Assembler des lignes liées avec join

    Utilisez join quand vos deux fichiers partagent une clé, par exemple un identifiant en première colonne. La commande rapproche les lignes dont la clé est identique, comme indiqué par la documentation GNU Coreutils.

    join clientsA.txt clientsB.txt

    Avec deux fichiers triés sur la première colonne, un résultat typique ressemble à une fusion : clé commune puis reste des colonnes des deux fichiers. Si le séparateur n'est pas l'espace, précisez-le explicitement.

    join -t ';' fichier1.csv fichier2.csv
  4. Inclure les lignes non appariées avec join

    Gros plan sur un écran montrant une fusion de deux fichiers texte dans un terminal, avec des lignes appariées et d’autres non appariées visibles dans un affichage aligné.

    Pour produire un rapport plus utile, affichez aussi les lignes sans correspondance. Les options -a permettent d'inclure les lignes orphelines du fichier 1, du fichier 2, ou des deux.

    join -a 1 -a 2 -t ';' fichier1.csv fichier2.csv

    Vous pouvez aussi choisir les colonnes de sortie avec -o pour fabriquer un rapport lisible. Exemple :

    join -a 1 -a 2 -t ';' -o 0,1.2,2.2 fichier1.csv fichier2.csv
  5. Afficher les changements précis avec diff

    Fenêtre de terminal sur un écran d’ordinateur affichant une comparaison ligne par ligne entre deux fichiers texte, suggérant des modifications précises entre les versions.

    Utilisez diff pour comparer deux versions d'un fichier et voir exactement quelles lignes changent. C'est l'outil le plus direct pour un rapport de modification ligne à ligne.

    diff ancien.txt nouveau.txt

    Pour une sortie plus lisible, préférez le format unifié :

    diff -u ancien.txt nouveau.txt

    Les lignes précédées de - viennent de l'ancien fichier, celles avec + du nouveau. Ce format est aussi celui utilisé couramment pour les correctifs texte.

  6. Filtrer un rapport utile selon votre besoin

    Choisissez l'outil selon la question posée. comm répond à “qu'est-ce qui manque ou existe dans les deux listes”, join à “quelles lignes partagent la même clé”, et diff à “qu'est-ce qui a changé entre deux versions”.

    Exemple simple de flux de travail :

    sort liste-ancienne.txt > a.txt
    sort liste-nouvelle.txt > b.txt
    comm -23 a.txt b.txt > supprimees.txt
    comm -13 a.txt b.txt > ajoutees.txt
    diff -u liste-ancienne.txt liste-nouvelle.txt > details.diff

    Vous obtenez alors un rapport court pour les écarts de liste et un rapport détaillé pour les modifications exactes.

Erreurs fréquentes & dépannage

La première erreur consiste à utiliser comm ou join sur des fichiers non triés. Le résultat peut sembler plausible tout en étant faux, donc contrôlez toujours l'ordre avant comparaison.

La deuxième erreur consiste à traiter un fichier CSV réel comme un simple texte délimité au point-virgule. Si des champs contiennent des séparateurs, des retours à la ligne ou des guillemets, join n'est plus suffisant.

La troisième erreur consiste à confondre différence de contenu et différence d'ordre. diff voit les déplacements comme des changements, alors que comm se concentre sur la présence ou l'absence après tri.

Astuces & pour aller plus loin

Ajoutez | less à la fin d'une commande pour lire un rapport long plus confortablement. C'est souvent plus pratique qu'un affichage direct dans le terminal.

Si vous comparez souvent les mêmes formats, créez un script shell qui trie, lance les commandes et écrit les fichiers de sortie. Vous réduirez les erreurs manuelles et gagnerez du temps.

Questions fréquentes

Quelle commande choisir pour deux listes simples, une ligne par élément ?

Choisissez d'abord comm, à condition de trier les deux fichiers de la même manière. C'est l'outil le plus simple pour isoler les éléments ajoutés, supprimés et communs.

Puis-je utiliser join sur des fichiers séparés par des points-virgules ?

Oui, avec l'option -t ';', si les fichiers sont triés sur la colonne de jointure et si le format reste un texte délimité simple. Ce n'est pas un parseur CSV complet.

Pourquoi diff donne-t-il beaucoup de changements après un simple tri ?

Parce que diff compare l'ordre et le contenu des lignes. Si vous triez un fichier, vous changez potentiellement la position de presque toutes les lignes.

Conclusion

Pour bien comparer deux fichiers texte, commencez par formuler votre besoin en une phrase. Si vous cherchez une présence ou une absence, utilisez comm ; si vous rapprochez des enregistrements, utilisez join ; si vous suivez des modifications précises, utilisez diff.

Commentaires · Aucun commentaire pour l'instant

Soyez le premier à réagir.

Laisser un commentaire