Mam bardzo długą serię adresów URL bez znaku oddzielającego, w tym samym formacie co poniżej:
http://example.comhttp://example.nethttp://example.orghttp://etc...
Chcę, aby każdy adres URL był w nowym wierszu. Próbowałem to zrobić, zastępując wszystkie wystąpienia „http: //” ciągiem „\ nhttp: //” za pomocą sed
sed 's_http://_\nhttp://_g' urls.txt
ale występuje błąd segmentacji (naruszenie pamięci). Mogę tylko przypuszczać, że sama wielkość pliku (ponad 100 GB) powoduje, że sed przekracza pewien limit.
Mógłbym podzielić plik na kilka mniejszych plików do przetworzenia, ale wszystkie wystąpienia „http: //” musiałyby pozostać nienaruszone.
Czy jest na to lepszy sposób?
text-processing
sed
C Sawyer
źródło
źródło
Odpowiedzi:
Dzięki temu
awk
możesz uniknąć czytania dużej ilości tekstu na raz:Sukces może zależeć od zastosowanej
awk
implementacji. Na przykładgawk
działa dobrze, alemawk
ulega awarii.źródło
Spowoduje to wykonanie zadania:
Ustawiając $ / , zmieniłem definicję linii, tak aby kończyła się na
//
zamiast nowej linii. To sprawia, że Perl czyta jeden adres URL na raz. Jest mało prawdopodobne, że adres URL zawiera//
oprócz schematu, ale jeśli tak się stanie, wyrażenie regularne uniemożliwi dodawanie fałszywych znaków nowego wiersza.Jeśli chcesz uniknąć dodawania pustego wiersza przed pierwszym adresem URL:
Możesz spróbować przeprowadzić testy porównawcze, aby sprawdzić, czy
s!http://\z!\nhttp://!
jest szybsze. Są równoważne. Zauważ, że/g
flaga nie jest konieczna przy podstawieniu, ponieważ może być tylko jedno dopasowanie na „linię”.źródło
$/
, będzie dotyczył tylko jednego adresu URL na raz.man perlvar
, ale ma to sens.http:
część wyrażenia regularnego. Sprawdza każdy//
, ale nie doda nowego wiersza, chyba że znajdziehttp://
.:
za pomocą nowej linii, aby posiekać plik.http
na końcu linii zhttp:
i dołącza do niej następną linięTe kroki wyglądają następująco:
Sprawdź, czy są linie, które nie zaczynają się od
http://
, wydrukuj numery linii. Dzieje się tak tylko wtedy, gdy: jest gdzieś w adresie URL innym niż pohttp
.grep -nv '^http://'
źródło