Comment comparer deux fichiers

59

Donc, fondamentalement, ce que je veux faire, c'est comparer deux fichiers par ligne par colonne 2. Comment pourrais-je accomplir cela?

File_1.txt:

User1 US
User2 US
User3 US

File_2.txt:

User1 US
User2 US
User3 NG

Output_File:

User3 has changed
    
posée Roboman1723 25.08.2014 - 16:58
la source

9 réponses

70

Regardez la commande diff . C'est un bon outil et vous pouvez tout lire en tapant man diff dans votre terminal.

La commande que vous voulez faire est diff File_1.txt File_2.txt qui affichera la différence entre les deux et devrait ressembler à ceci:

Une note rapide sur la lecture de la sortie de la troisième commande: les "flèches" ( < et > ) font référence à la valeur de la ligne dans le fichier de gauche ( < ) vs le fichier de droite ( > ), le fichier de gauche étant celui que vous avez entré en premier sur la ligne de commande, dans ce cas File_1.txt

En outre, vous remarquerez peut-être que la 4ème commande est diff ... | tee Output_File , ce qui conduit les résultats de diff à un tee , qui place ensuite cette sortie dans un fichier, afin de pouvoir la sauvegarder plus tard si vous ne le faites pas. voulez tout voir sur la console à droite cette seconde.

    
réponse donnée Mitch 25.08.2014 - 17:03
la source
31

Vous pouvez également utiliser Meld Diff

  

Meld vous aide à comparer des fichiers, des répertoires et des versions contrôlées   projets. Il fournit une comparaison à deux et à trois des deux fichiers et   répertoires, et prend en charge de nombreux systèmes de contrôle de version populaires.

Installer en exécutant:

sudo apt-get install meld

Votre exemple:

Répertoire de comparaison:

Exemple avec plein de texte:

    
réponse donnée Achu 25.08.2014 - 17:57
la source
10

Vous pouvez utiliser vimdiff .

Exemple:

vimdiff  file1  file2
    
réponse donnée Mr. S 28.08.2014 - 07:14
la source
7

Meld est un outil vraiment génial. Mais vous pouvez également utiliser diffuse pour comparer visuellement deux fichiers:

diffuse file1.txt file2.txt

    
réponse donnée Meysam 26.08.2014 - 08:54
la source
7

Par rapport à la question (fichier1, fichier2, fichier de sortie avec le message "a changé"), le script ci-dessous fonctionne.

Copiez le script dans un fichier vide, enregistrez-le sous le nom compare.py , rendez-le exécutable, exécutez-le par la commande:

/path/to/compare.py <file1> <file2> <outputfile>

Le script:

#!/usr/bin/env python

import sys
file1 = sys.argv[1]; file2 = sys.argv[2]; outfile = sys.argv[3]

def readfile(file):
    with open(file) as compare:
        return [item.replace("\n", "").split(" ") for item in compare.readlines()]

data1 = readfile(file1); data2 = readfile(file2)
mismatch = [item[0] for item in data1 if not item in data2]

with open(outfile, "wt") as out:
    for line in mismatch:
        out.write(line+" has changed"+"\n")

Avec quelques lignes supplémentaires, vous pouvez soit l'imprimer sur un fichier de sortie, soit sur le terminal, selon que le fichier de sortie est défini:

Pour imprimer dans un fichier:

/path/to/compare.py <file1> <file2> <outputfile>

Pour imprimer dans la fenêtre du terminal:

/path/to/compare.py <file1> <file2> 

Le script:

#!/usr/bin/env python

import sys

file1 = sys.argv[1]; file2 = sys.argv[2]
try:
    outfile = sys.argv[3]
except IndexError:
    outfile = None

def readfile(file):
    with open(file) as compare:
        return [item.replace("\n", "").split(" ") for item in compare.readlines()]

data1 = readfile(file1); data2 = readfile(file2)
mismatch = [item[0] for item in data1 if not item in data2]

if outfile != None:
        with open(outfile, "wt") as out:
            for line in mismatch:
                out.write(line+" has changed"+"\n")
else:
    for line in mismatch:
        print line+" has changed"
    
réponse donnée Jacob Vlijm 25.08.2014 - 20:34
la source
7

Vous pouvez utiliser la commande cmp :

cmp -b "File_1.txt" "File_2.txt"

sortie serait

a b differ: byte 25, line 3 is 125 U 116 N
    
réponse donnée Maythux 17.06.2015 - 12:58
la source
6

FWIW, j'aime bien ce que je reçois avec la sortie côte à côte de diff

diff -y -W 120 File_1.txt File_2.txt

donnerait quelque chose comme:

User1 US                            User1 US
User2 US                            User2 US
User3 US                          | User3 NG
    
réponse donnée Mike Reardon 22.05.2015 - 21:37
la source
3

Réponse supplémentaire

S'il n'est pas nécessaire de savoir quelles parties des fichiers diffèrent, vous pouvez utiliser la somme de contrôle du fichier. Il existe plusieurs façons de le faire, en utilisant md5sum ou sha256sum . Fondamentalement, chacun d'eux génère une chaîne à laquelle le contenu d'un fichier est haché. Si les deux fichiers sont identiques, leur hachage sera le même. Ceci est souvent utilisé lorsque vous téléchargez des logiciels, tels que les images iso d'installation 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 en arguments, et le fichier vous dira s'ils sont identiques ou non.

#!/bin/bash

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

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

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

Exemple:

$ ./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

De plus, il y a la commande comm , qui compare deux fichiers triés et donne une sortie en trois 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ésent dans les deux fichiers.

Pour supprimer l'une des colonnes, vous pouvez utiliser les commutateurs -1, -2 et -3. Utiliser -3 affichera les lignes qui diffèrent.

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

Il n’ya qu’une seule exigence: les fichiers doivent être triés pour pouvoir être comparés correctement. La commande sort peut être utilisée à cette fin. Ci-dessous, une autre capture d'écran, où les fichiers sont triés puis comparés. Les lignes commençant à gauche par File_1 uniquement, les lignes commençant par la colonne 2 appartiennent uniquement à File_2 uniquement

    
réponse donnée Sergiy Kolodyazhnyy 22.05.2015 - 21:51
la source
3

Une méthode simple consiste à utiliser colordiff , qui se comporte comme diff , mais colorise sa sortie. Ceci est très utile pour lire les diffs. A l'aide de votre exemple,

$ colordiff -u File_1.txt File_2.txt
--- File_1.txt  2016-12-24 17:59:17.409490554 -0500
+++ File_2.txt  2016-12-24 18:00:06.666719659 -0500
@@ -1,3 +1,3 @@
 User1 US
 User2 US
-User3 US
+User3 NG

où l’option u donne un diff unifié. Voici à quoi ressemble le diff colorisé:

Installez colordiff en exécutant sudo apt-get install colordiff .

    
réponse donnée edwinksl 25.12.2016 - 00:05
la source

Lire d'autres questions sur les étiquettes