
아래와 같은 형식으로 구분 문자가 없는 매우 긴 일련의 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://'