Nehmen wir an, ich habe eine sehr große Textdatei (ca. 10.000.000 Zeilen). Ich muss grep
es vom Ende an und als Ergebnis in eine Datei speichern. Was ist der effizienteste Weg, um eine Aufgabe zu erledigen?
command-line
sed
awk
grep
efficiency
Chaos
quelle
quelle
tac
undgrep
, um das zu erreichen, was Sie wollen.grep
verfügt GNU über einen--max-count (number)
Schalter, der nach einer bestimmten Anzahl von Übereinstimmungen abgebrochen wird, was für Sie interessant sein könnte.Antworten:
tac / grep Lösung
Oder etwas effektiver:
Zeit mit einer 500MB Datei:
sed / grep Lösung:
Zeit mit einer 500MB-Datei: Abgebrochen nach mehr als 10 Minuten.
awk / grep Lösung:
Zeit mit einer 500MB Datei:
perl / grep Lösung:
Zeit mit einer 500MB Datei:
quelle
sed
,awk
undperl
(mit dieser Methode) sind nicht OK, da sie die Datei von Anfang an lesen, was sehr ineffizient ist. Ich nehme an,tac
das ist das Richtige.< <(tac filename)
sollte so schnell wie eine Pipe sein: In beiden Fällen werden die Befehle parallel ausgeführt.tac
nach dem Grep zu setzen. Wenn Sie eine 10.000.000-Zeilen-Datei mit nur 2 Übereinstimmungen haben,tac
müssen Sie nur 2 Zeilen umkehren, nicht 10 m.grep
wird immer noch die ganze Sache so oder so durchmachen müssen.tac
nach dem setzengrep
, wird es aus einer Pipe gelesen und kann so nicht suchen. Das macht es weniger effizient (oder scheitert komplett), wenn die Anzahl der gefundenen Zeilen groß ist.Diese Lösung könnte helfen:
quelle
tac
ist der GNU-Befehl. Auf den meisten anderen Systemen ist das Äquivalenttail -r
.tail -r
die auf eine geringe Anzahl von Zeilen beschränkt sind, könnte dies ein Problem sein.tail -r /etc/passwd
scheitert mittail: invalid option -- 'r'
. Ich verwende coreutils-8.21-21.fc20.x86_64.tac
(und nur GNU hat tac) viele andere Unicestail -r
. GNUtail
unterstützt nicht-r
Dieser wird beendet, sobald er die erste Übereinstimmung findet:
Das Folgende gibt die 5 Zeilen vor und nach den ersten beiden Übereinstimmungen an:
Denken Sie daran, nicht
-i
(Groß- / Kleinschreibung wird nicht berücksichtigt) zu verwenden, es sei denn, Sie müssen dies tun, um das Grep zu verlangsamen.Wenn Sie die genaue Zeichenfolge kennen, die Sie suchen, ziehen Sie in Betracht
fgrep
(feste Zeichenfolge )quelle
Wenn die Datei wirklich groß ist, nicht in den Speicher passen kann, werde ich
Perl
mit File :: ReadBackwards Modul ausCPAN
:Dann:
quelle
tac
.