Ich habe eine große Datei mit einer Zeichenfolge in jeder Zeile. Ich möchte schnell feststellen können, ob sich eine Zeichenfolge in der Datei befindet. Idealerweise würde dies unter Verwendung eines binären Chop-Algorithmus erfolgen.
Einige Googler enthüllten den look
Befehl mit dem -b
Flag, das verspricht, alle Zeichenfolgen, die mit einem bestimmten Präfix beginnen, mithilfe eines binären Suchalgorithmus zu lokalisieren und auszugeben. Leider scheint es nicht richtig zu funktionieren und gibt Null-Ergebnisse für Zeichenfolgen zurück, von denen ich weiß, dass sie in der Datei enthalten sind (sie werden von der entsprechenden grep
Suche ordnungsgemäß zurückgegeben ).
Kennt jemand ein anderes Dienstprogramm oder eine andere Strategie, um diese Datei effizient zu durchsuchen?
look
Befehl korrekt funktioniert, da look das Gebietsschema zu ignorieren scheint und nur C wie das hartcodierte Sortieren verwendet, habe ich auch einen Fehler geöffnet wegen dieses verwirrenden Verhaltens: bugzilla.kernel.org/show_bug.cgi?id=198011look -b
fehlgeschlagen für mich mit einem FehlerFile too large
. Ich denke, es wird versucht, das Ganze in Erinnerung zu behalten.Antworten:
Es gibt einen wesentlichen Unterschied zwischen
grep
undlook
:Sofern nicht ausdrücklich anders angegeben,
grep
werden Muster sogar irgendwo innerhalb der Zeilen gefunden. Fürlook
die Manpage heißt es:Ich benutze es nicht
look
sehr oft, aber es hat bei einem trivialen Beispiel, das ich gerade ausprobiert habe, gut funktioniert.quelle
egrep "^TEST" sortedlist.txt | wc -l
, bekomme ich 41.289 Ergebnisse. Die entsprechendenlook
Befehlelook -b TEST sortedlist.txt | wc -l
liefern jedoch nur 1995 Ergebnisse. Ich frage mich fast, ob es einen Fehler gibtlook
.look
werden andere Sortiereinstellungen verwendet als das Programm, mit dem Sie die Datei sortiert haben.Vielleicht eine etwas späte Antwort:
Sgrep wird Ihnen helfen.
Sgrep (sortiertes grep) durchsucht sortierte Eingabedateien nach Zeilen, die einem Suchschlüssel entsprechen, und gibt die übereinstimmenden Zeilen aus. Bei der Suche nach großen Dateien ist sgrep viel schneller als herkömmliches Unix-Grep, jedoch mit erheblichen Einschränkungen.
Sie können die Quelle hier herunterladen: https://sourceforge.net/projects/sgrep/?source=typ_redirect
und die Dokumente hier: http://sgrep.sourceforge.net/
Ein anderer Weg:
Ich weiß nicht, wie groß die Datei ist. Vielleicht sollten Sie es parallel versuchen:
/programming/9066609/fastest-possible-grep
Ich grep immer mit Dateien, deren Größe> 100 GB ist, es funktioniert gut.
quelle
sudo apt-get install sgrep
Um sgrep zu erhalten, ist der sgrep in den Buntu-Repositories nicht wirklich dieser sgrep, ich bin mir nicht sicher, ob es dasselbe ist.Sie könnten die Datei in Stücke zerlegen und dann genau das Stück greifen, das Sie wollten:
dann würde die Suche so aussehen:
Dies macht zwei Dinge:
quelle
sgrep könnte für Sie arbeiten:
Auf der Projektseite http://sgrep.sourceforge.net/ heißt es:
Zum Einfügen gibt es jedoch meiner Meinung nach keine bessere Lösung als die Verwendung einer Datenbank: /programming/10658380/shell-one-liner-to-add-a-line-to-a-sorted-file/ 33859372 # 33859372
quelle
sgrep
in den Ubuntu-Repositories ist eigentlich dieses sgrep , das entworfen wurde, um "eine Datei nach einem strukturierten Muster zu durchsuchen" und nichts mit der binären Suche zu tun hat.Wenn Sie es wirklich schnell wollen (O (1) schnell), können Sie ein Hash-Set erstellen, in das Sie schauen können. Ich konnte keine Implementierung finden, mit der ich einen vorgefertigten Hash-Satz in einer Datei speichern und prüfen konnte, ohne die gesamte Datei in den Speicher lesen zu müssen, also habe ich meinen eigenen gerollt .
Erstellen Sie das Hash-Set (
-b
/--build
):Prüfen Sie den Hash-Satz (
-p
/--probe
):… Oder mit einer Zeichenfolge zum Nachschlagen der Standardeingabe:
Sie können die Ausgabe von
--probe
mit der Option-q
/--quiet
beruhigen, wenn Sie nur am Exit-Status interessiert sind:Weitere Optionen finden Sie in der Verwendungsbeschreibung, auf die über die Option
-h
/--help
oder die zugehörigeREADME
Datei zugegriffen werden kann.quelle