Ich habe eine Reihe von Textdateien, für die ich lieber die gemeinsamen Zeilen als die zwischen ihnen unterschiedlichen Zeilen kennen möchte. Befehlszeilen-Unix oder Windows ist in Ordnung.
foo:
linux-vdso.so.1 => (0x00007fffccffe000)
libvlc.so.2 => /usr/lib/libvlc.so.2 (0x00007f0dc4b0b000)
libvlccore.so.0 => /usr/lib/libvlccore.so.0 (0x00007f0dc483f000)
libc.so.6 => /lib/libc.so.6 (0x00007f0dc44cd000)
Bar:
libkdeui.so.5 => /usr/lib/libkdeui.so.5 (0x00007f716ae22000)
libkio.so.5 => /usr/lib/libkio.so.5 (0x00007f716a96d000)
linux-vdso.so.1 => (0x00007fffccffe000)
Angesichts dieser beiden Dateien über der Ausgabe des gewünschten Dienstprogramms wäre dies also vergleichbar file1:line_number, file2:line_number == matching text
(nur ein Vorschlag, die Syntax ist mir wirklich egal):
foo:1, bar:3 == linux-vdso.so.1 => (0x00007fffccffe000)
Vielen Dank.
command-line
diff
matt wilkie
quelle
quelle
Antworten:
Unter * nix können Sie comm verwenden . Die Antwort auf die Frage lautet:
Hier ist die vollständige Nutzung von
comm
:Beachten Sie auch, dass es wichtig ist, die Dateien zu sortieren, bevor Sie comm verwenden, wie in den Manpages erwähnt.
quelle
Diese Antwort wurde bei einer Frage gefunden, die als Duplikat aufgeführt ist . Ich finde, dass grep adminfreundlicher ist als comm. Wenn Sie also nur die passenden Zeilen (zum Beispiel zum Vergleichen von CSVs nützlich) verwenden möchten, verwenden Sie einfach
oder die vereinfachte fgrep-Version
Außerdem können Sie
file2*
nicht nur zwei, sondern mehrere Zeilen gemeinsam mit mehreren Dateien suchen.Einige andere praktische Variationen sind
-n
Flag, um die Zeilennummer jeder übereinstimmenden Zeile anzuzeigen-c
um nur die Anzahl der übereinstimmenden Zeilen zu zählen-v
um nur die Zeilen in Datei2 anzuzeigen , die sich unterscheiden (oder verwendendiff
).Die Verwendung
comm
ist schneller, aber diese Geschwindigkeit geht zu Lasten der Notwendigkeit, zuerst Ihre Dateien zu sortieren. Es ist nicht sehr nützlich als "Reverse Diff".quelle
-v
Flagge zu klären, nachdem ich selbst damit ausgerutscht war. Angenommen, Sie haben zwei CSV-Dateien, Datei1 und Datei2, und sie haben sowohl überlappende als auch nicht überlappende Zeilen. Wenn Sie alle und nur die nicht überlappenden Zeilen möchten, gibt usingfgrep -v file1 file2
nur die nicht überlappenden Zeilen in Datei2 und keine der zusätzlichen nicht überlappenden Zeilen in Datei1 zurück . Dies mag für einige offensichtlich sein, aber es ist besser, das Offensichtliche als das Risiko einer Fehlinterpretation anzugeben. In diesem speziellen Fall ist das Sortieren und Verwenden der Dateiencomm
immer noch die bessere Wahl.grep
: Jede leere Zeile in der ersten Datei stimmt mit jeder Zeile in der zweiten Datei überein. Stellen Sie sicher, dassfile1
keine Leerzeilen vorhanden sind. Andernfalls sehen die Dateien identisch aus.grep -Fxf
es ist für mich.Wurde hier schon einmal gefragt: Unix-Befehl, um in zwei Dateien gemeinsame Zeilen zu finden
Sie können es auch mit Perl versuchen (Gutschrift geht hier )
quelle
comm
nicht sofort verfügbar. Dies war die perfekte Alternative.Ich habe gerade den Befehl comm aus diesem Thread gelernt, wollte aber noch etwas hinzufügen: Wenn die Dateien nicht sortiert sind und Sie die Originaldateien nicht berühren möchten, können Sie die Ausgabe des Befehls sort leiten. Dadurch bleiben die Originaldateien erhalten. Funktioniert in Bash, ich kann nichts über andere Muscheln sagen.
Dies kann erweitert werden, um die Befehlsausgabe anstelle von Dateien zu vergleichen:
quelle
Der einfachste Weg ist:
Dateien müssen nicht sortiert werden.
quelle
Nur zur Information, ich habe ein kleines Tool für Windows erstellt, das dasselbe tut wie "grep -F -x -f Datei1 Datei2" (da ich unter Windows nichts gefunden habe, was diesem Befehl entspricht)
Hier ist es: http://www.nerdzcore.com/?page=commonlines
Die Verwendung ist "CommonLines inputFile1 inputFile2 outputFile".
Quellcode ist ebenfalls verfügbar (GPL)
quelle
In Windows können Sie ein Powershell- Skript mit CompareObject verwenden
CompareObject:
quelle