[bash] Zeilen aus einer Datei mit Mustern einer anderen Datei entfernen

21/11/2016 - 23:47 von Andreas Kohlbach | Report spam
Ich hatte Ähnliches hier schon mal angefragt, und es wurde mir etwas wie

grep -v -x -f2 -f1

empfohlen. Am WE fand ich Zeit dazu. Unten dazu mehr.

Zunàchst habe ich zwei Test-Dateien f1, die ca. 15,000 Zeilen hat und um
350 KB groß ist, und Zeilen wie

1234abcde
694@$%fwghij
zxyxwv

etc. hat, und die Datei f2, die die Referenz-Datei sein soll, und z.B.

1234
qwerty

enthàlt, selbst rund 4000 Zeilen.

Ich möchte in f1 alle Zeilen löschen, die Zeilen (oder auch nur Teile
einer Zeile) von f2 hat.

Also wenn f1 z.B. "1234abcde" hat und f2 "1234", soll diese Zeile aus f1
entfernt werden.

Ich hatte dazu etwas wie

grep -v -x -f2 -f1 > f3

(auch mit ">>") versucht in der Hoffnung, f3 würde dann nur doch die
Zeilen enthalten, die nicht in f2 vorkamen. Nachdem auch nach 30 Sekunden
nichts passierte, rief ich top auf: grep nahm sich alles, was es an CPU
Cycles eines CPU Kerns bekommen konnte. Dazu waren bereits nach
30 Sekunden 64% meiner 3 GB RAM verbraucht. Wenig spàter beendete sich
grep mit

| grep: memory exhausted

f3 blieb leer.

Warum nimmt grep bei einer 350 KB großen (die andere ist vielleicht 20 KB)
Datei allen RAM Speicher?

Und wie kann man das anderes, und möglichst ohne Sortierung (ich würde
gerne auf "sort" verzichten wenn möglich), erreichen?

Es stehen sonst noch Perl, Python oder auch AWK, ggf. noch mehr, zur
Verfügung. Die Shell ist eine aktuelle Bash auf Debian.
Andreas
You know you are a redneck if
you drive down the highway with dogs in the back of your pickup.
 

Lesen sie die antworten

#1 Frank Haun
22/11/2016 - 00:56 | Warnen spam
On Mon, 21 Nov 2016 17:47:10 -0500, Andreas Kohlbach wrote:

Ich hatte Ähnliches hier schon mal angefragt, und es wurde mir etwas wie

grep -v -x -f2 -f1

empfohlen. Am WE fand ich Zeit dazu. Unten dazu mehr.

Zunàchst habe ich zwei Test-Dateien f1, die ca. 15,000 Zeilen hat und um
350 KB groß ist, und Zeilen wie

1234abcde
694@$%fwghij
zxyxwv

etc. hat, und die Datei f2, die die Referenz-Datei sein soll, und z.B.

1234
qwerty

enthàlt, selbst rund 4000 Zeilen.

Ich möchte in f1 alle Zeilen löschen, die Zeilen (oder auch nur Teile
einer Zeile) von f2 hat.

Also wenn f1 z.B. "1234abcde" hat und f2 "1234", soll diese Zeile aus f1
entfernt werden.



Lösung habe ich nicht, aber das Problem ist interessant. Ich werde das
für mich mal in Go lösen. :-)

Nur zur Sicherheit, im Extremfall wàren das 15000 * 4000 Prüfungen?

Bin mal gespannt wie viel Zeit so eine Shell Lösung braucht.

Frank
Powered by "Arch Linux ARM", 4.4.33-1-ARCH GNU/Linux

Ähnliche fragen