오늘 같이 일하는 분의 의뢰(?)로 검색했는데,
생각보다 간단하게 텍스트의 중복을 제거할 수 있다.
아파치 로그에서 유니크한 사용자ID같은 것을 쉽게 추출할 수 있을 것 같다.
간단하지만 자주 안 쓰면 잊어 먹으므로 남겨놓는다.
1 2 3 4 5 6 7 8 9 |
{ if (data[$0]++ == 0) lines[++count] = $0 } END { for (i = 1; i <= count; i++) print lines[i] } |
코드는 길지만(?) 제일 중요한 라인은 결국 (data[$0]++ == 0) 비교구문이다.
어떤 데이터의 중복을 체크한다는 얘기다.
물론 awk문법에 따라 $0이 아니라 $1, $2등을 쓸 수도 있다.
처음에는 저 한문장으로 진짜 끝이나나… 싶었는데, 정말 스크립트가 편리하긴 하다.
awk의 배열에는 숫자이외의 문자, 소수 등의 데이터 타입도 index로 받을 수 있다.
generic같은 게 없으므로 배열의 값도 동적으로 바꿔준다. (++을 하면 0으로 초기화해서 1씩 더한다)
즉, 결국은 모두 배열의 키로 넣고 있는지 없는지 체크해주는 로직이다.
출처 : http://www.chemie.fu-berlin.de/chemnet/use/info/gawk/gawk_17.html#SEC168
내용추가>
덧글에 sort와 uniq를 사용하면 된다고 해서 –help를 찍어봤다.
uniq는 해당 데이터가 첫번째 나타날 때만 표시하는 것(즉, 중복제거)
심지어 -c 옵션을 주면, 몇 번 노출되었는지 횟수까지 나온다… ㄷㄷ
근데, uniq는 전후 데이터만 비교하나보다.. 결국 sort와 uniq는 함께 써야 하는구나.
내가 종종 했던게 특정 프로세스의 메모리에 어떤 파일들이 올라가 있나 본거였는데, 리눅스에서 메모리는 /proc/{pid}/maps 파일에 있거든
cat /proc/{pid}/maps | awk ‘{print $6}’ | sort | uniq
요런식으로 봤었지ㅎㅎㅎ
sort, uniq 이런 명령어도 있구나.. 쉬운 길 괜히 돌아가는구나..ㅋㅋ