매우 큰 파일의 문자열 바꾸기

매우 큰 파일의 문자열 바꾸기

구분 문자가 없는 다음 형식의 긴 일련의 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://'

관련 정보