it-swarm.com.de

Vergleichen von zwei Dateien im Linux-Terminal

Es gibt zwei Dateien mit dem Namen "a.txt" und "b.txt", die beide eine Liste von Wörtern enthalten. Jetzt möchte ich überprüfen, welche Wörter in "a.txt" und nicht in "b.txt" enthalten sind.

Ich brauche einen effizienten Algorithmus, um zwei Wörterbücher zu vergleichen.

151
Ali Imran

Hier ist meine Lösung dafür:

mkdir temp
mkdir results
cp /usr/share/dict/american-english ~/temp/american-english-dictionary
cp /usr/share/dict/british-english ~/temp/british-english-dictionary
cat ~/temp/american-english-dictionary | wc -l > ~/results/count-american-english-dictionary
cat ~/temp/british-english-dictionary | wc -l > ~/results/count-british-english-dictionary
grep -Fxf ~/temp/american-english-dictionary ~/temp/british-english-dictionary > ~/results/common-english
grep -Fxvf ~/results/common-english ~/temp/american-english-dictionary > ~/results/unique-american-english
grep -Fxvf ~/results/common-english ~/temp/british-english-dictionary > ~/results/unique-british-english
0
Ali Imran

wenn Sie vim installiert haben, versuchen Sie Folgendes:

vimdiff file1 file2

oder

vim -d file1 file2

sie werden es fantastisch finden.enter image description here

321
Fengya Li

Sortieren Sie sie und verwenden Sie comm:

comm -23 <(sort a.txt) <(sort b.txt)

comm vergleicht (sortierte) Eingabedateien und gibt standardmäßig drei Spalten aus: Zeilen, die für a eindeutig sind, Zeilen, die für b eindeutig sind, und Zeilen, die in beiden vorhanden sind. Durch Angabe von -1, -2 Und/oder -3 Können Sie die entsprechende Ausgabe unterdrücken. Daher listet comm -23 a b Nur die Einträge auf, die für a eindeutig sind. Ich benutze die <(...) -Syntax, um die Dateien im laufenden Betrieb zu sortieren. Wenn sie bereits sortiert sind, brauchen Sie dies nicht.

62

Versuchen Sie sdiff (man sdiff)

sdiff -s file1 file2
28
mudrii

Sie können das Tool diff unter Linux verwenden, um zwei Dateien zu vergleichen. Sie können die Optionen - geändertes Gruppenformat und - unverändertes Gruppenformat verwenden, um die erforderlichen Daten zu filtern.

Mit den folgenden drei Optionen können Sie die relevante Gruppe für jede Option auswählen:

  • '% <' ruft Zeilen aus DATEI1 ab

  • '%>' holt Zeilen aus FILE2

  • '' (leere Zeichenkette) zum Entfernen von Zeilen aus beiden Dateien.

Zum Beispiel: diff --changed-group-format = "% <" --unchanged-group-format = "" file1.txt file2.txt

[[email protected] tmp]# cat file1.txt 
test one
test two
test three
test four
test eight
[[email protected] tmp]# cat file2.txt 
test one
test three
test nine
[[email protected] tmp]# diff --changed-group-format='%<' --unchanged-group-format='' file1.txt file2.txt 
test two
test four
test eight
26
Manjula

Wenn Sie den Diff-Ausgabestil von git diff Bevorzugen, können Sie ihn mit dem Flag --no-index Verwenden, um Dateien zu vergleichen, die sich nicht in einem Git-Repository befinden:

git diff --no-index a.txt b.txt

Anhand einiger Dateien mit jeweils etwa 200.000 Dateinamenzeichenfolgen habe ich diesen Ansatz (mit dem integrierten Befehl time) im Vergleich zu einigen anderen Antworten hier verglichen:

git diff --no-index a.txt b.txt
# ~1.2s

comm -23 <(sort a.txt) <(sort b.txt)
# ~0.2s

diff a.txt b.txt
# ~2.6s

sdiff a.txt b.txt
# ~2.7s

vimdiff a.txt b.txt
# ~3.2s

comm scheint bei weitem der schnellste Ansatz zu sein, während git diff --no-index der schnellste Ansatz für die Ausgabe im Diff-Stil zu sein scheint.


Update 2018-03-25 Sie können das Flag --no-index Auch weglassen, es sei denn, Sie befinden sich in einem Git-Repository und möchten nicht verfolgte Dateien darin vergleichen dieses Repository. Von den Manpages :

Dieses Formular dient zum Vergleich der beiden angegebenen Pfade im Dateisystem. Sie können die Option --no-index weglassen, wenn Sie den Befehl in einem von Git gesteuerten Arbeitsbaum ausführen und mindestens einer der Pfade außerhalb des Arbeitsbaums verweist, oder wenn Sie den Befehl außerhalb eines von Git gesteuerten Arbeitsbaums ausführen.

21
joelostblom

Sie können auch Folgendes verwenden: Colordiff : Zeigt die Ausgabe von Diff mit Farben an.

Über vimdiff : Hiermit können Sie Dateien über SSH vergleichen, zum Beispiel:

vimdiff /var/log/secure scp://192.168.1.25/var/log/secure

Auszug aus: http://www.sysadmit.com/2016/05/linux-diferencias-entre-dos-archivos.html

9
FindlinuxOne

Vergessen Sie auch nicht mcdiff - Interner Diff Viewer von GNU Midnight Commander .

Zum Beispiel:

mcdiff file1 file2

Genießen!

6
Iurii Golskyi

Verwenden comm -13(benötigt sortierte Dateien:

$ cat file1
one
two
three

$ cat file2
one
two
three
four

$ comm -13 <(sort file1) <(sort file2)
four
4
Chris Seymour