Atomic Habits

[리눅스] perl을 이용한 치환 (빠른 편) 본문

IT/Linux-Vim

[리눅스] perl을 이용한 치환 (빠른 편)

체계성 2021. 12. 1. 23:01

- 파일 내용 치환 replace (빠른 편)  : sed 's///g' 느림

$ perl -pi -e 's/\\//g' t3.txt      

$ perl -pi -e 's/\\//g' t1.txt t2.txt : 2개 파일 동시에 수행  ( (원화사인) \ 만 찾을 경우 \\를 입력 )

$ perl -pi -e 's/\\//g' *.txt         : .txt 파일 모두 변경

 

- 현재 디렉토리에 존재하는 모든 파일들에 대해 OLDSTRING 문자열을 NEWSTRING 문자열로 치환한다.

1
% find ./ -name "*" -exec perl -p -i -e 's/OLDSTRING/NEWSTRING/g' {} \;

- 파일 내용 찾기 grep

$ grep -i --color -n '문자열' *.txt        ( '문자열' , "문자열" 모두 가능 )

$ grep -i --color -n '\\' *.txt  ( (원화사인) \ 만 찾을 경우 \\를 입력해야 하고, "(불가) '(가능) )

$ grep -i --color -n '\\'   t1.txt   t2.txt  (  연이어 표기 가능 )

$ grep -c '\\' 문자열"   t1.txt   t2.txt  ( 총 갯수만 파악 )

$ grep -i --color -n -m3 '\\'  t1.txt   t2.txt (  각 파일에서 3개 까지만 찾고 검색 중단할 때 )

* 출처 : grep 옵션 보기 https://rfriend.tistory.com/372

- 라인 수 세기 (빠른 편)                                   23GB - 1분 내 완료           

$ wc -l  *.txt        $ wc -l  t1.txt t2.txt  

  7 t1.txt
  8 t2.txt                                                     마지막 개행 파트도 count됨.
 15 total

 

- 특정 단어 수 세기

$ grep -o '\\' *.txt | wc -l

- 특정 단어가 있는 라인 수 세기

$ cat *.txt | grep '\\' | wc -l

여러 파일에서 \(원화사인)이 포함된 라인 수를 출력 -> t1.txt에 3개, t2.txt 에 4개 있으면, 총 개수 7만 출력함.

- 파일 병합 / 합치기 (빠른 편)

$ cat  t1.txt  t2.txt > t0.txt       ※ 파일명이 낮은 순위여야 t0.txt 까지 합치는 과정이 발생하지 않음

 

            

 

출처: https://firstboos.tistory.com/entry/대용량-텍스트-파일-내용-변경하기 [散策 의 정리공간]

대용량 텍스트 파일 내용 변경하기

산책이  2012. 4. 19. 

텍스트 파일 내용중에 일부를 다른 문자열로 치환하기 위해 sed 로 실행해보았다.

텍스트 파일은 12 GB 정도, 서버 : CPU Intel Xeon 2.6 GHz, RAM 4GB

# sed 's/AAA/BBB/g' text > conv_text

실행시간 : 대략 20분에서 30분에서 작업이 종료. 

-> sed 자체에서 변경하는 부분이 문제일 수도 있지만, redirect 로 다른 파일로 저장하는 것도 실행 시간에 문제가 되었을 것이다.

 

perl 을 사용해서 동일한 작업을 수행했다.

# time perl -pe 's/AAA/BBB/g' text

real    6m51.624s

user    1m3.129s

sys     0m42.110s

-> 대략 6,7분 사이에 완료되었다. 백업파일 옵션을 안줘서 그런가해서 다시한번 테스트 해보았다.

 

# time perl -ibak -pe 's/AAA/BBB/g' text

real    6m45.249s

user    1m4.498s

sys     0m42.332s

-> 시간이 더 적게 나온거는 오차가 있겠지만, "text.bak" 원본파일도 같이 생성되어도 작업이 6,7 분에 완료되었다.

 

perl 이 대용량 파일처리에 우수하다는 얘기는 들어보았지만 실제 사용하기는 처음인데, 이런 차이가 있을 줄은 몰랐다. perl 을 사용해서 파일 처리 테스트를 많이 적용해 보아야 겠다.

 

참고 :

http://wiki.kldp.org/wiki.php/PerlCommandLineCookBook




출처 : https://javafactory.tistory.com/470

#perl -pi -e  's/원본문자열/바꿀문자열/g' <파일명>  (빠른 편)

e    주어진 Perl 명령 실행

p    지정한 파일을 대상으로 작업

i     원본파일을 결과파일로 대체

 

 

응용 : html 파일을  찾아 EUC_KR 을 UTF 8로 바꿔보기. 

 

#find ./ -name '*.html' -exec perl -pi -e 's/EUC_KR/UTF-8/g' {} \;

{}  <- {} find 에서 찾아낸 검색 결과가 하나씩 들어가는 부분

\;  <-   -exec 다음부분에 나와있는 명령어 를 실행하라는 부분

 

$find ./ -name '*.txt' -exec perl -pi -e 's/\\//g' {} \;

$ perl -pi -e 's/\\//g' *.txt

 

 

 

 

Comments