2007. 11. 6. 15:02

리스트 비교

리스트를 비교하는 방법에는 "grep -f", "sort, diff", "comm" 등이 대표적이다.
"grep -f" 는 시간이 너무 오래 걸리는 단점이 있지만 diff, comm등은 강력한 도구이다.
하지막 역시 많은 파일과 복잡한 선택기준 앞에서 나의 가장 강력한 도구는 PERL!!

내가 주로 쓰는 커맨드를 소개한다면
perl -nle '/(regex)/ and $h[@ARGV]{$1}=$_;END{map{statement;}keys %{$h[0]}}' file1 file0
주의 할 점은 @ARGV(남은 파일 개수)을 인덱스로 사용하기 때문에 인자로 준 파일순서와 인덱스가 거꾸로라는 것.
위 예제에서 file1이 $h[1], file0 가 $h[0] 에 저장된다.(file1 과 file0의 순서에 주의)
statement를 위해서 여러가지 상상력을 동원할 수 있다.

간단한 예
perl -nle '/(\d{6}-\d{4})/ and $h[@ARGV]{$1}=$_;END{map{ exists $h[1]{$_} and print $h[1]{$_} }keys %{$h[0]}}' file1 file0

file1과 file0에서 123456-1234형태의 패턴(내가 주로 사용하는 런넘버-세그먼트넘버) 을 추출해서 file1과 file0의 공집합의 file1리스트를 출력한다.
비교할 리스트의 성질에 따라 코드는 많이 짧아질 수도 있다.
극단적으로 두 리스트의 똑같은 라인들만 검색하기 위해서는 다음과 같이 할 수도 있다.

perl -e '@s{`cat OLD`}=( ); exists $s{$_} && print for `cat NEW`' fire1 file2
2007. 11. 6. 10:26

터미널의 타이핑 내용을 녹화한다.

가끔 심심할때면 쉘에서 특정 영단어로 시작하는 프로그램들이 어떤것이 있는지 찾아보곤 하는데 얼마전 script 란 주옥같은 명령어를 찾게 되었다. 우왓 내가 모르던 스크립팅 언어인가!!

 script - make typescript of terminal session

말 그대로 작업내용을 녹화해 놓았다가 재생할 수 있다.
  • 녹화
$ script -t 2> timing
        Script started, file is typescript
        $ ls
        Desktop         hax             hog.sh  My Computer             ostg    src
        $ pwd
        /home/jonesy
        $ file hax
        hax: empty
        $ exit
        exit
        Script done, file is typescript

  •  재생
        $ scriptreplay timing
        $ ls
        Desktop         hax             hog.sh  My Computer             ostg    src
        $ pwd
        /home/jonesy
        $ file hax
        hax: empty
        $ exit
        exit


작업하는 모습을 다른 사람에게 실시간으로 보여줄수도 있다.
선생님 :
  $ mkfifo  out 
  $ script -f out

학생 :
 $ cat out

선생님:
 $ 이렇게 이렇게 하는 거예요..
 $ exit

오~~ 멋지다.. 그런데 쓸일은 별로 없을 것 같네..
참고로 screen 으로도 실시간 교육을 할수가 있다는 사실.. 역시 별로 쓸일은 없지만.
2007. 11. 5. 20:23

한꺼번에 많은 파일 지우는 세가지 방법

원래 펄 사용의 주 목적이 리스트 및 파일 관리였기 때문에 다양한 요구조건에 대해서 가장 효율 적인 방법은 일일이 스크립트파일을 만드는 것 보다 awk, 나 sed 처럼 커맨드라인에서 바로 코드를 만드는 방법이라고 생각하고 있었다.  덕분에 프로그램을 만들때 조금만 길이기 길어져도 헤매는 부작용이 생기기는 했지만.

그 전까지는 그냥 상상력에 의존하여 나름 필요한 코드를 만들어오곤 했었는데 다음 코드를 보고는 그 포스에 감동해버렸다.
find ./ -name "*.bak" -type f| perl -nleunlink  # 코드 1
현재 디렉토리 아래의 모든 *.bak파일을 지우는 코드.

한 디렉토리에 지워야 할 파일이 매우 많을때(1024개 이상?)
rm -f *.bak        # 코드 2
는 작동하지 않는다. 이때 위의 perl 코드1은 잘 동작한다.(물론 코드1은 하위디렉토리까지 검색한다는 차이는 있다.)
 perl이외에도 방법은 있다.
find ./ -name "*.bak" -type f -exec rm -f \{\} \;       #코드3
find ./ -name "*.bak" -type f | xargs rm -f                   #코드4
코드3의 문제는 모든 파일마다 rm을 실행하므로 매우 느리다는 데 있다.
코드4의 문제는 xargs를 이용하기 때문에 rm을 호출하는 횟수가 더 적어진다.
코드1의 경우 단 하나의 perl 프로세스를 이용하여 파일을 지우기 때문에 이방법이 가장 빠를 것으로 예상할 수있다.

사실 코드4의 xargs 가  코드1의 perl보다 그리 느릴꺼라고 생각하지는 않는다. 적어도 한 프로세스로 100개이상의 파일을 처리할 수 있다면 소모되는 시간은 파일을 삭제 하는데 걸릴 시간이기 때문이다. 게다가 코드1은 사실상 perl의 아름다움을 보여주기 위하여 좀 과장된 측면이 있다. 예를 들어 처리중에 지우지 못하는 파일이 있어도, 혹은 아예 없는 파일이 리스트에 주어져도 아무런 경고를 내지 않는다. 이를 해결하기 위해서 우리는 "die" 나 "print" 또는 "warn"등의 구문을 추가해야한다.
find ./ -name "*.bak" -type f | perl -nle'unlink or die"Can't remove $_ : $!"'
빠른 방법이라고는 하지만 이제 코드쓰기가 매우 귀찮아졌다. 나라도 xargs가 쓰고싶어 질 것이다. (실제로 그러고 있다.) 하지만 반대로 생각해볼 수 있다. 지우지 못하는 파일에대한 경고를 추가했던 것처럼 우리는 필요한 무엇이든 추가할 수 있다. 텍스트 파일만 지워보자.
find ./ -name "*.bak" -type f | perl -nle'-T and unlink or print "Can't remove $_ : $!"
 find 의 옵션들을 perl로 옮겨 더욱 강력하게 만들 수도 있다.
find | perl -nle '/\.bak$/ && -f && -T and unlink or print "Can't remove $_ : $!"
(파일 테스트 연산자가 제대로 맞는지 잘 기억이...)
(주의: && and 등의 연산자가 헷갈린다면 언제나 괄호와 if 가 우리 앞에 있음을 있지 말자)

정말 지워야할 파일이 많을 수록. 지워야 할 파일을 선택하는데 기준이 복잡할 수록, 위의 코드 한줄이 점점 짧게 보일 것이다.

'Perl Recipe' 카테고리의 다른 글

두 문자열에서 중복되는 부분 찾기  (0) 2009.03.25
일전한 글자수의 단어 세기  (7) 2009.03.24
원라인 펄 놀이 - 첫줄 빼고 sort  (0) 2008.04.17
여러파일을 sorting 하기  (0) 2007.12.11
리스트 비교  (0) 2007.11.06
2007. 11. 4. 21:29

Slide.com

IMPRESS MAGAZiNE에서 보고 slide.com에서 슬아이드를 만들어보았다.
슬라이드 기능은 매우 훌륭하고 한번에 여러장의 사진을 올릴 수도 있다. 어떤 방법을 쓴거지?
사진수 제한이 없기는 하지만 여러장의 사진을 한꺼번에 다운받는다던가 하는 기능이 친절하지 않아 사진 보관용으로는 훌륭한 것 같지는 않다. 
아직은 picasa와 연동가능한 google webalbum이 사진보관용으로는 제일 적당한 것 같다.
google webalbum이 용량제한이 있기는 하지만 여러 계정을 사용하면.. 웁. 이거 말해도 되는건가?


'Web' 카테고리의 다른 글

새로운 웹RSS리더 웹피쉬  (0) 2007.11.27
2007. 11. 4. 15:40

펄마니아 스터디 후기

어제(10월3일) 펄마니아 스터디가 있었습니다.
권혁진님, 김대호님, 김도형님, 박민영님, 저, 제 후배 2명, 그리고 한분(이름이 잘 생각이...) 이렇게 8분이 오셨습니다. 맞나요?  카메라를 가져가지 않아서 사진은 하나도 못찍었네요.

모임 장소인 숭실대가 신촌에서 가까울 거라고 마음대로 상상해 버렸다가 모임시간이 3시에서 20분이나 늦게 도착했습니다. 게다가 "웨스터민스터 관" 을 찾느라고 이리 저리 해매고, 다른 건물에 올라갔다가 다시 내려오는 일을 반복하느라 굉장히 늦어버렸는데 다행히(?) 세미나실 빌리는 문제로 모임이 한시간 가량 지체되어서 마음속으로 만들었던 수많은 변명들을 하지 않아도 되었습니다.
모임장소 확보하시느라 고생하신 도형님께 박수를!!

"펄 제대로 배우기 2판"이 교재여서 금방 스터디가 끝날 줄 알았는데 참석자 분들의 뜨거운 열의로 결국 4챕터를 진행하는데 3시간이 넘는 시간이 걸렸죠.  특히 도형님과  혁진님의 물흐르는 듯한  친절하고 자세한 설명은  매우 감동적이었습니다.

스터디가 다 끝나고 나서 다음 스터디 계획을 좀 세우고 나서는 헤어졌습니다.
원래 첫 스터디고 해서 술 한잔 하자고 말하려고 했는데 도형님께서 먼저 "책 한권 끝날때 마다 책거리 하자"고 말씀하시는 통해 원래 소심함 pung96은 쑥 들어가 버렸습니다.
오면서 후회도 되고 해서.. 그냥 신촌에서 후배 둘과 함께 삼겹살을...

펄 제대로 배우기 교재를 쓴다고 해서 재밌을까 걱정도 되었었는데 생각보다 훨씬 재미있었습니다.
어제 정말 재대로 배운것이 두가지가 있습니다.
    1. 역시 공부는 혼자해서는 한계가 있다.
    2. 아.. 러닝펄에서 내가 모르는게 이렇게 많았구나.



'PerlMania' 카테고리의 다른 글

map, grep 그리고 //g의 함정  (3) 2007.11.19
3번째 펄마니아 스터디 모임  (5) 2007.11.18