385 Stimmen

Schneller Weg, um Zeilen in einer Datei zu finden, die in einer anderen nicht vorhanden sind?

Ich habe zwei große Dateien (Sets von Dateinamen). Etwa 30.000 Zeilen in jeder Datei. Ich versuche einen schnellen Weg zu finden, um Zeilen in Datei1 zu finden, die nicht in Datei2 vorhanden sind.

Zum Beispiel, wenn dies Datei1 ist:

Zeile1
Zeile2
Zeile3

Und das ist Datei2:

Zeile1
Zeile4
Zeile5

Dann sollte mein Ergebnis/Ausgabe sein:

Zeile2
Zeile3

Dies funktioniert:

grep -v -f file2 file1

Aber es ist sehr, sehr langsam, wenn es auf meine großen Dateien angewendet wird.

Ich vermute, es gibt eine gute Möglichkeit, dies mit diff() zu tun, aber die Ausgabe sollte nur die Zeilen sein, nichts anderes, und ich kann keinen Schalter dafür finden.

Kann mir jemand helfen, einen schnellen Weg zu finden, dies zu tun, unter Verwendung von Bash und grundlegenden Linux-Binärdateien?

BEARBEITEN: Um auf meine eigene Frage einzugehen, dies ist der beste Weg, den ich bisher gefunden habe, um diff() zu verwenden:

diff file2 file1 | grep '^>' | sed 's/^>\ //'

Sicherlich muss es einen besseren Weg geben?

15voto

Puggan Se Punkte 5580

Was ist die Geschwindigkeit von as sort und diff?

sort file1 -u > file1.sorted
sort file2 -u > file2.sorted
diff file1.sorted file2.sorted

13voto

OBX Punkte 5874

Dies scheint schnell für mich zu sein :

comm -1 -3 <(sort file1.txt) <(sort file2.txt) > output.txt

6voto

Zombo Punkte 1
$ join -v 1 -t '' file1 file2
line2
line3

Das -t stellt sicher, dass er die gesamte Zeile vergleicht, wenn du ein Leerzeichen in einigen der Zeilen hast.

5voto

HelloGoodbye Punkte 3184

Sie können Python verwenden:

python -c '
lines_to_remove = set()
with open("file2", "r") as f:
    for line in f.readlines():
        lines_to_remove.add(line.strip())

with open("f1", "r") as f:
    for line in f.readlines():
        if line.strip() not in lines_to_remove:
            print(line.strip())
'

2voto

konsolebox Punkte 66082

Die Verwendung von fgrep oder das Hinzufügen der Option -F zu grep könnte helfen. Aber für schnellere Berechnungen könnten Sie Awk verwenden.

Sie könnten eine dieser Awk-Methoden ausprobieren:

http://www.linuxquestions.org/questions/programming-9/grep-for-huge-files-826030/#post4066219

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X