콘텐츠로 건너뛰기

awk에서 특정 내용 중복제거

오늘 같이 일하는 분의 의뢰(?)로 검색했는데,
생각보다 간단하게 텍스트의 중복을 제거할 수 있다.
아파치 로그에서 유니크한 사용자ID같은 것을 쉽게 추출할 수 있을 것 같다.
간단하지만 자주 안 쓰면 잊어 먹으므로 남겨놓는다.

코드는 길지만(?) 제일 중요한 라인은 결국 (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는 함께 써야 하는구나.

“awk에서 특정 내용 중복제거”의 2개의 댓글

  1. 내가 종종 했던게 특정 프로세스의 메모리에 어떤 파일들이 올라가 있나 본거였는데, 리눅스에서 메모리는 /proc/{pid}/maps 파일에 있거든

    cat /proc/{pid}/maps | awk ‘{print $6}’ | sort | uniq

    요런식으로 봤었지ㅎㅎㅎ

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다