Antworten:
Die naheliegendste Antwort ist die Verwendung des Befehls diff. Es ist wahrscheinlich eine gute Idee, den Parameter --speed-large-files hinzuzufügen.
diff --speed-large-files a.file b.file
Sie erwähnen unsortierte Dateien, daher müssen Sie die Dateien möglicherweise zuerst sortieren
sort a.file > a.file.sorted
sort b.file > b.file.sorted
diff --speed-large-files a.file.sorted b.file.sorted
Sie können das Erstellen einer zusätzlichen Ausgabedatei sparen, indem Sie die Ausgabe der zweiten Sortierung direkt in diff leiten
sort a.file > a.file.sorted
sort b.file | diff --speed-large-files a.file.sorted -
Offensichtlich laufen diese am besten auf einem System mit viel verfügbarem Speicher und Sie werden wahrscheinlich auch viel freien Speicherplatz benötigen.
Aus Ihrer Frage ging nicht hervor, ob Sie diese bereits ausprobiert haben. Wenn ja, wäre es hilfreich zu wissen, was schief gelaufen ist (zu lange usw. gedauert hat). Ich habe immer festgestellt, dass die Befehle stock sort und diff mindestens genauso gut funktionieren wie benutzerdefinierte Befehle, es sei denn, es gibt einige sehr domänenspezifische Eigenschaften der Dateien, die es ermöglichen, Dinge anders zu machen.
diff <(command 1) <(command 2)
<(cmd1) <(cmd2)
Syntax funktioniert (da es sich anhört, als würde man die Standardeingabe zweimal umleiten!), Versuchen Sie es echo hello <(cmd1) <(cmd2)
. Du wirst so etwas sehen, hello /dev/fd/63 /dev/fd/62
was es plötzlich klar macht;)
--speed-large-files
hilft die Option nicht, wenn Sie nicht über genügend RAM verfügen. Die Vorsortierung ist auch nicht hilfreich, wenn Sie eine mehrzeilige Datensatzstruktur haben, die Sie beibehalten möchten. Die oben genannten Optionen (von @unhammer) sind interessant, aber die Ausgabe von rdiff
und bsdiff
ist eher binär. Die Installation bdiff
von der Heirloom Toolbox aus scheint eine schwierige Aufgabe zu sein (erfordert Heirloom-Devtools, ausgestorbene Header-Dateien usw.). Lohnt sich der Aufwand wirklich? Gibt es noch andere Alternativen?
Wenn diff
Sie die Eingaben sortieren und dem Programm mitteilen , dass die Eingaben sortiert sind, würde dies zu einer enormen Beschleunigung führen. Ich kenne keine diff
mit einer solchen Option, gehe aber comm
von sortierten Eingaben aus und werde viel schneller sein, wenn sie für Ihre Zwecke ausreichen.
comm
hat großartig funktioniert, noch nie davon gehört, aber anscheinend ist es in coreutils.
mkfifo
zu erstellen ,[ab].file.sorted
bevor sie als Ausgabe verwendetsort
. Stellen Sie beidesort
s mit&
in den Hintergrund und verwenden Sie beide als Dateinamen für diff.