Es gibt zwei Dateien mit den 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" extra sind und welche nicht in "b.txt" .
Ich brauche einen effizienten Algorithmus, da ich zwei Wörterbücher vergleichen muss.
linux
terminal
diff
file-comparison
Ali Imran
quelle
quelle
diff a.txt b.txt
ist nicht genug?Antworten:
Wenn Sie vim installiert haben, versuchen Sie Folgendes:
oder
Sie werden es fantastisch finden.
quelle
Sortieren Sie sie und verwenden Sie
comm
: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 die Angabe-1
,-2
und / oder-3
Sie können die entsprechende Ausgabe zu unterdrücken.comm -23 a b
Listet daher 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 diese nicht.quelle
comm
ist effizienter, da es die Arbeit in einem einzigen Lauf erledigt, ohne die gesamte Datei im Speicher zu speichern. Da Sie Wörterbücher verwenden, die höchstwahrscheinlich bereits sortiert sind, brauchen Sie sie nicht einmalsort
. Wenn Siegrep -f file1 file2
dagegen verwenden, wird der gesamtefile1
Speicher in den Speicher geladen und jede Zeilefile2
mit all diesen Einträgen verglichen , was viel weniger effizient ist. Es ist meistens nützlich für kleine, unsortierte-f file1
.\n
es auch zum Vergleichen enthalten sein wird.Try
sdiff
(man sdiff
)quelle
Sie können das
diff
Tool unter Linux verwenden, um zwei Dateien zu vergleichen. Sie können die Optionen --changed-group-format und --unchanged-group-format verwenden , um die erforderlichen Daten zu filtern.Die folgenden drei Optionen können verwendet werden, um die relevante Gruppe für jede Option auszuwählen:
'% <' ruft Zeilen aus FILE1 ab
'%>' ruft Zeilen aus FILE2 ab
'' (leere Zeichenfolge) zum Entfernen von Zeilen aus beiden Dateien.
quelle
Wenn Sie den Diff-Ausgabestil bevorzugen
git diff
, können Sie ihn mit dem--no-index
Flag verwenden, um Dateien zu vergleichen, die sich nicht in einem Git-Repository befinden:Unter Verwendung einiger Dateien mit jeweils etwa 200.000 Dateinamenzeichenfolgen habe ich
time
diesen Ansatz (mit dem integrierten Befehl) mit einigen der anderen Antworten hier verglichen :comm
scheint bei weitem der schnellste zu sein, währendgit diff --no-index
er der schnellste Ansatz für die Ausgabe im Diff-Stil zu sein scheint.Update 2018-03-25 Sie können das
--no-index
Flag tatsächlich weglassen, es sei denn, Sie befinden sich in einem Git-Repository und möchten nicht verfolgte Dateien in diesem Repository vergleichen. Aus den Manpages :quelle
Sie können auch Folgendes verwenden: colordiff : Zeigt die Ausgabe von diff mit Farben an.
Über vimdiff : Sie können Dateien über SSH vergleichen, zum Beispiel:
Auszug aus: http://www.sysadmit.com/2016/05/linux-diferencias-entre-dos-archivos.html
quelle
Vergessen Sie auch nicht mcdiff - Interner Diff-Viewer von GNU Midnight Commander .
Beispielsweise:
Genießen!
quelle
Verwendung
comm -13
(erfordert sortierte Dateien) :quelle
Hier ist meine Lösung dafür:
quelle
sdiff -s file1 file2
war dies nützlich.Verwenden Sie awk dafür. Testdateien:
Die awk:
Duplikate werden ausgegeben:
Um Duplikate zu vermeiden, fügen Sie jedes neu getroffene Wort in a.txt zu
seen
Hash hinzu:Ausgabe:
Wenn die Wortlisten durch Kommas getrennt sind, wie:
Sie müssen ein paar zusätzliche Runden (
for
Loops) fahren:Diesmal ausgeben:
quelle