매우 큰 파일에서 문자열 대체

매우 큰 파일에서 문자열 대체

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

  1. :파일을 잘라내려면 a의 모든 항목을 개행 문자로 변경하세요 .
  2. 바꾸다
    • http줄 끝에
    • 개행 문자 다음 http:에 다음 행을 추가합니다.
  3. 한 번 반복하면 짝수 라인과 홀수 라인이 업데이트됩니다.

이 단계는 다음과 같습니다.

tr ':' '\n' | sed -e '/http$/{N;s/http\n/\nhttp:/}' | sed -e '/http$/{N;s/http\n/\nhttp:/}'
  1. 로 시작하지 않는 줄이 있는지 확인하고 http://줄 번호를 인쇄하세요. 이는 :가 URL 뒤가 아닌 다른 위치에 있는 경우에만 발생합니다 http.

    grep -nv '^http://'

관련 정보