구분 문자가 없는 다음 형식의 긴 일련의 URL이 있습니다.
http://example.comhttp://example.nethttp://example.orghttp://etc...
각 URL을 래핑하고 싶습니다. 나는 sed를 사용하여 "http://"의 모든 인스턴스를 "\nhttp://"로 대체함으로써 이를 수행하려고 합니다.
sed 's_http://_\nhttp://_g' urls.txt
하지만 분할 오류(메모리 위반)가 발생합니다. 파일의 절대 크기(100GB 이상)로 인해 sed가 일부 제한을 초과했다고 추측할 수 있습니다.
처리를 위해 파일을 여러 개의 작은 파일로 분할할 수 있지만 "http://"의 모든 인스턴스는 그대로 유지되어야 합니다.
더 좋은 방법이 있나요?
답변1
이를 사용하면 awk
한 번에 많은 양의 텍스트를 읽는 것을 피할 수 있습니다.
awk -vRS='http://' -vORS='\nhttp://' 1 urls.txt > urlsperline.txt
성공 여부는 사용된 구현에 따라 달라질 수 있습니다 awk
. 예를 들어, gawk
잘 작동하지만 mawk
충돌이 발생합니다.
답변2
이렇게 하면 작업이 수행됩니다.
perl -pe 'BEGIN { $/ = "//" } s!(?=http://\z)!\n!' urls.txt
설정으로$///
, 줄 바꾸기로 끝나 도록 줄 정의를 변경했습니다 . 이로 인해 Perl은 한 번에 하나의 URL을 읽습니다. URL에 //
구성표 뒤를 제외하고는 포함되지 않을 가능성이 있지만, 포함하더라도 상관없습니다. 정규식은 가짜 줄바꿈을 추가하는 것을 방지합니다.
첫 번째 URL 앞에 빈 줄을 추가하지 않으려면 다음을 수행하세요.
perl -pe 'BEGIN { $/ = "//"; print scalar <> } s!(?=http://\z)!\n!' urls.txt
벤치마킹을 시도하여 더 빠른지 확인할 수 있습니다 s!http://\z!\nhttp://!
. 그것들은 동일합니다. /g
"라인"당 하나의 일치 항목만 있을 수 있으므로 교체할 때 이 플래그가 필요하지 않습니다 .
답변3
:
파일을 분할하려면 a의 모든 항목을 개행 문자로 변경하세요 .- 바꾸다
http
줄 끝에서- 줄 바꿈 문자 뒤에
http:
다음 줄이 추가됩니다.
- 한 번 반복하면 짝수 행과 홀수 행이 모두 업데이트됩니다.
단계는 다음과 같습니다:
tr ':' '\n' | sed -e '/http$/{N;s/http\n/\nhttp:/}' | sed -e '/http$/{N;s/http\n/\nhttp:/}'
로 시작하지 않는 줄이 있는지 확인
http://
하고 줄 번호를 출력하세요. :이 URL에 있고 에 없는 경우에만 해당됩니다http
.grep -nv '^http://'