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


10

아래와 같은 형식으로 구분 문자가없는 매우 긴 URL 시리즈가 있습니다.

http://example.comhttp://example.nethttp://example.orghttp://etc...

각 URL을 새 줄에 추가하고 싶습니다. sed를 사용하여 "http : //"의 모든 인스턴스를 "\ nhttp : //"로 바꾸어이 작업을 시도했습니다.

sed 's_http://_\nhttp://_g' urls.txt

그러나 세그먼테이션 오류가 발생합니다 (메모리 위반). 파일 크기가 100GB를 초과하여 sed가 일부 제한을 초과하고 있다고 추측 할 수 있습니다.

처리를 위해 파일을 여러 개의 작은 파일로 분할 할 수 있지만 "http : //"의 모든 인스턴스는 그대로 유지해야합니다.

더 좋은 방법이 있습니까?


sed는 버퍼에서 한 줄을 읽으려고 할 때 줄 끝이없는 100GB를 좋아하지 않는다고 생각합니다.
jippie

분할 ( "자르는 위치"와 상관 없음), 가공 및 재 조립은 올바른 결과를 제공해야합니다.
enzotib

3
하나의 긴 줄을 포함하는 100GB 텍스트 파일이 있다면 빠른 C 프로그램을 작성하여 작업하는 것이 좋습니다.
fpmurphy

답변:


11

함께 awk사용하면 한 번에 많은 양의 텍스트를 읽고 피할 수 있습니다 :

awk -vRS='http://' -vORS='\nhttp://' 1 urls.txt > urlsperline.txt

성공 여부는 사용 된 awk구현 에 따라 달라질 수 있습니다 . 예를 들어 gawk잘 작동하지만 mawk충돌합니다.


6

이것은 일을 할 것입니다 :

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만 "라인"당 하나의 일치가있을 수 있기 때문에 플래그, 대체에 필요하지 않습니다.


펄 정규식 엔진이 멀티 기가 바이트 길이의 라인으로 괜찮습니까?
Alexios

2
@Alexios는 아닐 수도 있지만 반드시 그럴 필요는 없습니다. 내가 변경 $/했으므로 한 번에 하나의 URL 만 처리합니다.
CJM

아, 내가 뭘했는지 알아 90 년대 이래로 오랜 세월이 흘렀지만, 그래야 man perlvar했지만, 그런 식으로 말이됩니다.
Alexios

Linux에서는 URL에 경로에 여러 개의 슬래시를 포함시킬 수 있으므로이 코드가 있으면이 코드가 실패 할 수 있습니다. 전체 문자열 (http 및 all)을 테스트하면이 문제가 발생하지 않습니다.
Joe

@ 조, 나는 http:정규식 의 부분을 테스트하고 있습니다. 모든 것을 검사 //하지만을 찾지 않으면 개행을 추가하지 않습니다 http://.
cjm

5
  1. :줄 바꾸기로 파일 의 모든 부분을 변경 하여 파일을 잘라냅니다.
  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://'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.