Ich habe ein Diff, das im Wesentlichen entweder zusätzliche eindeutige Zeilen oder Zeilen, die in der Datei verschoben wurden, und damit ihre Zeilennummern geändert haben. Um herauszufinden, was wirklich eine neue Ergänzung ist, betreiben ich diesen kleinen Perl-Schnipsel, die ‚gelöst‘ Zeilen aus den ‚ungelöst‘ Linien zu trennen:grep nicht sehr gut auf großen Dateien, gibt es eine Alternative?
perl -n -e'
/^\-([^\-].*?)\([^,\(]+,\d+,\d+\).*$/ && do { print STDOUT "$1\n"; next; };
/^\+([^\+].*?)\([^,\(]+,\d+,\d+\).*$/ && do { print STDERR "$1\n"; next; };
' "$delta" 1>resolved 2>unresolved
Das ist ziemlich schnell in der Tat und macht den Job, ein 6000 Trennung + Linie diff in zwei 3000+ Zeilen-Dateien, entfernen Sie alle Verweise auf Zeilennummern und einheitliche diff-Dekoration. Als nächstes kommt der grep-Befehl, der bei 100% CPU zu laufen scheint für fast 9 Minuten (real): im Wesentlichen
grep -v -f resolved unresolved
Dies wird alle aufgelösten Linien aus der ungelösten Datei zu entfernen. Die Ausgabe, nach 9 Minuten, ist zufällig 9 Zeilen der Ausgabe - die eindeutigen Ergänzungen oder unaufgelösten Zeilen.
Erstens, wenn ich Grep in der Vergangenheit benutzt habe, war es ziemlich gut, also warum ist es in diesem Fall außergewöhnlich langsam und CPU-hungrig?
Zweitens gibt es eine effizientere Alternative zum Entfernen von Zeilen aus einer Datei, die in einer anderen enthalten sind?
Okay, ich denke, ich habe meine eigene Frage ein wenig mit den Zahlen beantwortet. Grep analysiert 3000 Zeilen einer Datei, möglicherweise 3000 mal, also vielleicht einer 9.000.000 Zeilen großen Datei. Aber das ist immer noch nicht so groß. Es ist fast so, als würde grep 60 Sekunden brauchen, um 1.000.000 Zeilen zu analysieren. – Craig
Beachten Sie, dass '. * $ 'Nutzlos ist – ikegami
Sicher, aber ich dachte nur^könnte ein wenig einsam ohne ein $ werden. :-) – Craig