133 votes

Comment comparer deux fichiers

En gros, ce que je veux faire, c'est comparer deux fichiers par ligne et par colonne 2. Comment pourrais-je y parvenir ?

Fichier_1.txt :

User1 US
User2 US
User3 US

Fichier_2.txt :

User1 US
User2 US
User3 NG

Output_File :

User3 has changed

2voto

Sergiy Kolodyazhnyy Points 97292

Réponse complémentaire

S'il n'y a pas besoin de savoir quelles parties des fichiers diffèrent, vous pouvez utiliser la somme de contrôle du fichier. Il y a plusieurs façons de le faire, en utilisant md5sum o sha256sum . En fait, chacun d'entre eux produit une chaîne de caractères à laquelle le contenu du fichier est associé. Si les deux fichiers sont identiques, leur hachage sera également le même. Cette méthode est souvent utilisée lorsque vous téléchargez des logiciels, comme les images iso d'installation d'Ubuntu. Ils sont souvent utilisés pour vérifier l'intégrité d'un contenu téléchargé.

Considérez le script ci-dessous, où vous pouvez donner deux fichiers comme arguments, et le fichier vous dira s'ils sont identiques ou non.

#!/bin/bash

# Check if both files exist  
if ! [ -e "$1"  ];
then
    printf "%s doesn't exist\n" "$1"
    exit 2
elif ! [ -e "$2" ]
then
    printf "%s doesn't exist\n" "$2"
    exit 2
fi

# Get checksums of eithe file
file1_sha=$( sha256sum "$1" | awk '{print $1}')
file2_sha=$( sha256sum "$2" | awk '{print $1}')

# Compare the checksums
if [ "x$file1_sha" = "x$file2_sha" ]
then
    printf "Files %s and %s are the same\n" "$1" "$2"
    exit 0
else
    printf "Files %s and %s are different\n" "$1" "$2"
    exit 1
fi

Exemple d'exécution :

$ ./compare_files.sh /etc/passwd ./passwd_copy.txt                                                                
Files /etc/passwd and ./passwd_copy.txt are the same
$ echo $?
0
$ ./compare_files.sh /etc/passwd /etc/default/grub                                                                
Files /etc/passwd and /etc/default/grub are different
$ echo $?
1

Réponse plus ancienne

En outre, il y a comm qui compare deux fichiers triés, et donne une sortie en 3 colonnes : colonne 1 pour les éléments uniques au fichier #1, colonne 2 pour les éléments uniques au fichier #2, et colonne 3 pour les éléments présents dans les deux fichiers.

Pour supprimer l'une ou l'autre des colonnes, vous pouvez utiliser les commutateurs -1, -2 et -3. L'utilisation de -3 fera apparaître les lignes qui diffèrent.

Ci-dessous, vous pouvez voir une capture d'écran de la commande en action.

enter image description here

Une seule condition est requise : les fichiers doivent être triés pour pouvoir être comparés correctement. sort peut être utilisée à cette fin. Voici une autre capture d'écran, où les fichiers sont triés et ensuite comparés. Les lignes qui commencent à gauche appartiennent au Fichier_1 seulement, les lignes qui commencent à la colonne 2 appartiennent au Fichier_2 seulement.

enter image description here

1voto

augusto Points 368

Même si cette question concerne la "ligne de commande", je propose un autre outil GUI : kompare, de KDE. Je le trouve très efficace enter image description here

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X