원라인 펄 놀이 - 첫줄 빼고 sort
2008. 4. 17. 09:26 in Perl Recipe

#perl 에서 saillinux님과 JEEN님의 "쉘에서 파일의 첫 줄을 빼고 소팅하려면"이라는 대화내용을 듣다가 이를 위한 몇가지 아이디어가 떠롤랐다.
파일의 첫줄을 출력한다 던가 마지막 줄을 출력하는 것은 head나 tail로 쉽게 할 수 있지만 첫 줄을 빼고 출력하는 방법은?
1. 다음과 같은 saillinux 님이 가르쳐 주신 위대한 방법도 있다.
옛날 연구실의 한 선배는 awk 두개를 써서 더블 루프을 구현하기도 했었다.
그러나 다행히도 더 간단한 방법이 있다.
2. tail
간단히 +를 숫자앞에 붙이면 끝이다. 문제는, 이 기능이 언제부터 생긴건지 모르기 때문에 호환성이 좀 걱정된다는 사실.
3. sed
그러나 진정한 강자는 따로 있는 법
4. perl
이제 남은 건 sort 하는 일뿐!! 이건 뭐... 첫줄은 출력하고 나머지는 sort하면 된다.
그러나 여기서 끝내기엔 너무 쉬운 내용을 너무 길게 썼다.
뭔가 더해보자.
소팅하고 출력하는 것을 펄 안에서 끝내보자.
목표는 : 텍스트를 다 배열에 저장하여 첫줄 빼고 소팅한 다음 출력한다.
잘 되긴 하는데,, 뭔가 아쉬운 이 느낌은 뭘까, 너무 당연한 코드라서 재미가 없다.
게다가 매줄마다 push를 하는건,, 너무 비싸다는 생각이!!
모든 줄을 한꺼번에 배열에 넣을 방법은 없을까?
음, 이럴땐 첨부터 꽁수를 생각해보자.
오늘의 새로운 아이디어!!
1. 파일을 읽어서 배열에 넣는 방법
2. perl -ne에서 END{}를 쓰기 귀찮다면 }{를 쓰면 된다.
파일의 첫줄을 출력한다 던가 마지막 줄을 출력하는 것은 head나 tail로 쉽게 할 수 있지만 첫 줄을 빼고 출력하는 방법은?
1. 다음과 같은 saillinux 님이 가르쳐 주신 위대한 방법도 있다.
tail -n `expr \`wc -l file-to-sort | awk '{ print $1 }'\` - 1` file.txt
오.. 왠만한 내공이 아니고는 만들기도 힘든 구문!! `` 안에 ``를 쓰는 센스!!옛날 연구실의 한 선배는 awk 두개를 써서 더블 루프을 구현하기도 했었다.
그러나 다행히도 더 간단한 방법이 있다.
2. tail
tail -n +2 file.txt
언제부턴지는 모르겠지만 tail 에 "앞에서 몇줄부터" 출력해주는 기능이 생겼다. 간단히 +를 숫자앞에 붙이면 끝이다. 문제는, 이 기능이 언제부터 생긴건지 모르기 때문에 호환성이 좀 걱정된다는 사실.
3. sed
sed -n '2,$p' file.txt
오래 전부터 이런 일은 awk, sed 가 강자였지..그러나 진정한 강자는 따로 있는 법
4. perl
perl -ne'$.>1 and print' file.txt
perl -ne'2..-1 and print' file.txt
perl -ne'2..eof and print' file.txt
오.. 가장 "리더블" 하지 않은가!!(물론, $.을 알아야 하지만)perl -ne'2..-1 and print' file.txt
perl -ne'2..eof and print' file.txt
이제 남은 건 sort 하는 일뿐!! 이건 뭐... 첫줄은 출력하고 나머지는 sort하면 된다.
head -1 file.txt; perl -ne'$.>1 and print' file.txt | sort
그러나 여기서 끝내기엔 너무 쉬운 내용을 너무 길게 썼다.
뭔가 더해보자.
소팅하고 출력하는 것을 펄 안에서 끝내보자.
목표는 : 텍스트를 다 배열에 저장하여 첫줄 빼고 소팅한 다음 출력한다.
perl -ne'push @L, $_;END{print $L[0],sort @L[1..$#L];}' file.txt
잘 되긴 하는데,, 뭔가 아쉬운 이 느낌은 뭘까, 너무 당연한 코드라서 재미가 없다.
게다가 매줄마다 push를 하는건,, 너무 비싸다는 생각이!!
모든 줄을 한꺼번에 배열에 넣을 방법은 없을까?
음, 이럴땐 첨부터 꽁수를 생각해보자.
perl -ne'$f=$_;@l=<>;print $f,sort@l;last' file.txt
오옷!! 이거 그럴 듯 하다!! 더 꼬아보자!! perl -ne'@l=<>;last}{print $_,sort@l' file.txt
매우 맘에 드는 코드가 나왔지만, 펄을 새로 시작하는 사람에게는 절대 보여줘선 안될 코드 같다.오늘의 새로운 아이디어!!
1. 파일을 읽어서 배열에 넣는 방법
perl -ne'@L=($_,<>)' file.txt
2. perl -ne에서 END{}를 쓰기 귀찮다면 }{를 쓰면 된다.
perl -ne'push @L,$_ }{ print sort $L'
'Perl Recipe' 카테고리의 다른 글
두 문자열에서 중복되는 부분 찾기 (0) | 2009.03.25 |
---|---|
일전한 글자수의 단어 세기 (7) | 2009.03.24 |
여러파일을 sorting 하기 (0) | 2007.12.11 |
리스트 비교 (0) | 2007.11.06 |
한꺼번에 많은 파일 지우는 세가지 방법 (1) | 2007.11.05 |