2013-08-05 15 views
15

Voglio trovare la differenza tra due file e quindi inserire solo le differenze in un terzo file. Ho visto approcci diversi usando awk, diff e comm. Ce ne sono altri?Il modo più veloce per trovare le differenze tra due file in unix?

es. Compare two files line by line and generate the difference in another file

es. Copy differences between two files in unix

ho bisogno di sapere che è il modo più veloce di trovare tutte le differenze e elencandoli in un file per ciascuno dei casi al di sotto -

Case 1 - file2 = file1 + extra text appended. 
Case 2 - file2 and file1 are different. 
+7

dal momento che questo dipende dalla vostra ingressi, si è meglio cronometrare da solo – perreal

+0

puoi per favore rendere i tuoi casi più specifici e magari fornire qualche esempio di codice delle cose che hai provato? – asf107

+1

Per il caso 2 c'è 'cmp' che confronta due file byte per byte. – micke

risposta

39

Si potrebbe provare ..

comm -13 <(sort file1) <(sort file2) > file3 

o

grep -Fxvf file1 file2 > file3 

o

diff file1 file2 | grep "<" | sed 's/^<//g' > file3 

o

join -v 2 <(sort file1) <(sort file2) > file3 
+0

sì, ma quale sarebbe il più veloce? – Steam

+1

Utilizzando due file di testo di grandi dimensioni in cui uno ha un paragrafo in più di testo vicino all'inizio, ho cronometrato tutti e quattro i metodi. I metodi grep, diff e join non sono riusciti a trovare il paragrafo aggiuntivo. I metodi diff hanno bisogno di grep ">" oltre a "<" per funzionare. Non ho familiarità con i metodi grep o join. I risultati: comm: 3.661s, grep: 0.035s, diff: 0.051s, join: 3.811s –

+1

@JasonHartley Ottieni una compagna di vita, ci sono solo tanti modi in cui questi comandi potrebbero essere scritti. Anche la risposta che eludete ha un comando in cui ne ho forniti diversi. – danmc

1

Si potrebbe anche provare a includere MD5 hash-somme o simili non determinare se ci sono eventuali differenze a tutti. Poi, confrontare solo i file che hanno diverse hash ...

+0

come faccio? – Steam

+0

Ma l'hashing di due file è più veloce rispetto al confronto di due file? –

8

Un'altra opzione:

sort file1 file2 | uniq -u > file3 

Se si desidera visualizzare solo le voci duplicate utilizzano "uniq -d" opzione:

sort file1 file2 | uniq -d > file3 
0

Funzionerà velocemente:

Caso 1 - File2 = File1 + testo aggiuntivo aggiunto.

grep -Fxvf file2.txt File1.txt >> file3.txt

File 1: 80 linee file 2: 100 linee File 3: 20 linee

Problemi correlati