유닉스: cut 과 uniq 를 아시나요?
유닉스를 사용하다보면 텍스트 데이터를 짜집기 할 일이 생길것이다.
그럴때마다 pc로 내려서 엑셀 및 울트라 에디터에서 작업을 하는 이들을 종종 보는데
그럴때마다 cut 과 uniq 라는 유닉스 명령어를 권해주고 싶다.
일단 샘플 데이터 a.txt 라는 파일의 내용을 보자.
1|2009-12-31|aaa
2|2009-12-31|bbb
3|2009-12-31|aaa
4|2009-12-31|aaa
5|2009-12-31|ccc
6|2009-12-31|ddd
7|2010-1-1|aaa
8|2010-1-2|aaa
9|2010-1-3|bbb
10|2010-1-4|ccc
11|2010-1-4|eee
12|2010-1-4|fff
13|2010-1-4|ddd
'|' 라는 것을 구분자로 하여 첫번째 항목은 순번, 두번째 항목은 발생일, 세번째 항목은 발생자(사고친 넘?)라고 하자.
자! 나는 사고친넘의 명단만 필요하다. 어떻게 할 것인가?
구분자가 있고, 몇 번째 나오는지만 알면 게임이 끝난것이다. <cut> 이라는 명령어를 이용해 보자.
test:/user1] cut -d \| -f 3 a.txt
aaa
bbb
aaa
aaa
ccc
ddd
aaa
aaa
bbb
ccc
eee
fff
ddd
자! 사고친 놈들의 명단은 나왔다.
그런데 뭔가 부족하다. 중복된 넘들이 나와 보기가 힘들다....
그럴때 uniq 라는 명령어를 이용해 보자. (파이프 '|' 와 함께 사용을 해야 한다.)
test:/user1] cut -d \| -f 3 a.txt | uniq
aaa
bbb
aaa
ccc
ddd
aaa
bbb
ccc
eee
fff
ddd
그런데 중복이 제거가 되다만듯한 느낌이다. 왜일까?
uniq 명령어의 메카니즘이 순차적 데이터에 대해 중복을 제거하다 보니 그럴수 밖에 없다.
즉, a a a 이렇게 들어오면 a 로 정리가 되지만 a a b a 로 들어오면 a b a 로 밖에 정리가 안된다.
그럼 어떻게 하면 될까?
sort 명령어 투입이다. 이렇게....
test:/user1] cut -d \| -f 3 a.txt | sort | uniq
aaa
bbb
ccc
ddd
eee
fff
이해가 됐는가?
조금 더 확장된 사용은 나중에... ^^