Ich habe eine sehr lange Reihe von URLs ohne Trennzeichen im gleichen Format wie unten:
http://example.comhttp://example.nethttp://example.orghttp://etc...
Ich möchte, dass jede URL in einer neuen Zeile steht. Ich habe versucht, dies zu tun, indem ich alle Instanzen von "http: //" durch "\ nhttp: //" mit sed ersetzt habe
sed 's_http://_\nhttp://_g' urls.txt
Es tritt jedoch ein Segmentierungsfehler auf (Speicherverletzung). Ich kann nur vermuten, dass die schiere Größe der Datei (über 100 GB) dazu führt, dass sed ein bestimmtes Limit überschreitet.
Ich könnte die Datei zur Verarbeitung in mehrere kleinere Dateien aufteilen, aber alle Instanzen von "http: //" müssten intakt bleiben.
Gibt es einen besseren Weg, dies zu tun?
text-processing
sed
C Sawyer
quelle
quelle
Antworten:
Mit können
awk
Sie vermeiden, große Textmengen gleichzeitig zu lesen:Der Erfolg kann von der verwendeten
awk
Implementierung abhängen . Zum Beispielgawk
funktioniert gut,mawk
stürzt aber ab.quelle
Dies wird den Job machen:
Durch das Setzen von $ / habe ich die Definition einer Zeile so geändert, dass sie mit
//
einer neuen Zeile endet . Dadurch liest Perl jeweils eine URL. Es ist unwahrscheinlich, dass eine URL//
außer nach dem Schema enthält, aber wenn dies der Fall ist, verhindert die Regex, dass falsche Zeilen hinzugefügt werden.Wenn Sie vermeiden möchten, vor der ersten URL eine Leerzeile einzufügen:
Sie können versuchen, ein Benchmarking durchzuführen, um festzustellen, ob
s!http://\z!\nhttp://!
es schneller ist. Sie sind gleichwertig. Beachten Sie, dass das/g
Flag bei der Ersetzung nicht erforderlich ist, da es nur eine Übereinstimmung pro "Zeile" geben kann.quelle
$/
, wird immer nur eine URL behandelt.man perlvar
, aber es macht so Sinn.http:
Teil in der Regex. Es wird jeden untersuchen//
, aber es wird keine neue Zeile hinzugefügt, es sei denn, es findethttp://
.:
mit einem Zeilenumbruch, um die Datei zu zerlegen.http
am Ende der Zeile mithttp:
und fügen Sie die nächste Zeile hinzuDiese Schritte sehen folgendermaßen aus:
Überprüfen Sie, ob es Zeilen gibt, die nicht mit beginnen
http://
, und drucken Sie die Zeilennummern. Dies würde nur auftreten, wenn sich a: irgendwo in der URL befindet, außer nach demhttp
.grep -nv '^http://'
quelle