Come confrontare due file

59

Quindi sostanzialmente quello che voglio fare è confrontare due file per riga per colonna 2. Come potrei realizzare questo?

File_1.txt:

User1 US
User2 US
User3 US

File_2.txt:

User1 US
User2 US
User3 NG

output_file:

User3 has changed
    
posta Roboman1723 25.08.2014 - 16:58

9 risposte

70

Esamina il comando diff . È un buon strumento e puoi leggerlo tutto digitando man diff nel tuo terminale.

Il comando che vorresti fare è diff File_1.txt File_2.txt , che genererà la differenza tra i due e dovrebbe avere un aspetto simile a questo:

Una breve nota sulla lettura dell'output dal terzo comando: le "frecce" ( < e > ) si riferiscono a quale valore della linea si trova nel file di sinistra ( < ) rispetto al file corretto ( > ), il file di sinistra è quello che hai inserito per primo sulla riga di comando, in questo caso File_1.txt

Inoltre potreste notare che il 4 ° comando è diff ... | tee Output_File questo convoglia i risultati da diff in tee , che poi mette quell'output in un file, in modo che possiate salvarlo per dopo se non lo fate voglio vederlo tutto sulla console proprio quel secondo.

    
risposta data Mitch 25.08.2014 - 17:03
31

Oppure puoi utilizzare Diffusione dei contenuti

  

Combina ti aiuta a confrontare file, directory e versioni controllate   progetti. Fornisce un confronto a due e tre vie di entrambi i file e   directory e supporta molti sistemi di controllo delle versioni più diffusi.

Installa eseguendo:

sudo apt-get install meld

Il tuo esempio:

Confronta directory:

Esempio con testo completo:

    
risposta data Achu 25.08.2014 - 17:57
10

Puoi usare vimdiff .

Esempio:

vimdiff  file1  file2
    
risposta data Mr. S 28.08.2014 - 07:14
7

Meld è uno strumento davvero eccezionale. Ma puoi anche usare diffuse per confrontare visivamente due file:

diffuse file1.txt file2.txt

    
risposta data Meysam 26.08.2014 - 08:54
7

Litteraly si attacca alla domanda (file1, file2, file di output con messaggio "è cambiato") lo script sotto funziona.

Copia lo script in un file vuoto, salvalo come compare.py , rendilo eseguibile, eseguilo con il comando:

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

Lo 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")

Con poche righe aggiuntive, puoi farlo stampare su un file di output o sul terminale, a seconda che il file di output sia definito:

Per stampare su un file:

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

Per stampare sulla finestra del terminale:

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

Lo 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"
    
risposta data Jacob Vlijm 25.08.2014 - 20:34
7

Puoi utilizzare il comando cmp :

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

l'output sarebbe

a b differ: byte 25, line 3 is 125 U 116 N
    
risposta data Maythux 17.06.2015 - 12:58
6

FWIW, mi piace piuttosto quello che ottengo con l'output side-by-side da diff

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

darebbe qualcosa come:

User1 US                            User1 US
User2 US                            User2 US
User3 US                          | User3 NG
    
risposta data Mike Reardon 22.05.2015 - 21:37
3

Risposta aggiuntiva

Se non è necessario sapere quali parti dei file differiscono, è possibile utilizzare il checksum del file. Ci sono molti modi per farlo, usando md5sum o sha256sum . Fondamentalmente, ognuno di loro emette una stringa su cui un file contiene hash. Se i due file sono uguali, anche il loro hash sarà lo stesso. Questo è spesso usato quando si scarica software, come ad esempio le immagini di installazione di Ubuntu. Vengono spesso utilizzati per verificare l'integrità di un contenuto scaricato.

Considera lo script di seguito, in cui puoi fornire due file come argomenti e il file ti dirà se sono uguali o meno.

#!/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

Esecuzione di esempio:

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

Risposta precedente

Inoltre c'è il comando comm , che confronta due file ordinati e dà l'output in 3 colonne: colonna 1 per gli elementi univoci del file # 1, colonna 2 per gli elementi unici del file # 2 e colonna 3 per gli elementi presente in entrambi i file.

Per sopprimere entrambe le colonne puoi usare gli switch -1, -2 e -3. Usando -3 mostrerà le linee che differiscono.

Qui sotto puoi vedere lo screenshot del comando in azione.

Esiste un solo requisito: i file devono essere ordinati per essere confrontati correttamente. Il comando sort può essere utilizzato a tale scopo. Bellow è un altro screenshot, in cui i file vengono ordinati e quindi confrontati. Le righe che iniziano sul lato sinistro a solo File_1, le righe che iniziano sulla colonna 2 appartengono a File_2 solo

    
risposta data Sergiy Kolodyazhnyy 22.05.2015 - 21:51
3

Un modo semplice è usare colordiff , che si comporta come diff ma colorizza il suo output. Questo è molto utile per leggere diff. Usando il tuo esempio,

$ 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

dove l'opzione u fornisce una differenza unificata. Ecco come appare la diff colorata:

Installa colordiff eseguendo sudo apt-get install colordiff .

    
risposta data edwinksl 25.12.2016 - 00:05

Leggi altre domande sui tag