bash script2023. 7. 6. 10:41

 

반달가면 이글루에서 백업 - http://bahndal.egloos.com/576672

 

문서 파일에서 중복되는 행이 있는지 확인하고 선별할 때 uniq 명령을 사용하면 편리하다. 중복 여부는 현재 행과 바로 다음 행을 비교하는 방식이므로 sort 명령과 조합해서 사용하면 된다. 형식이 정형화되어 있는 문서 파일에서 작업을 할 때 유용하다.

우선, 중복 회수를 파악할 수 있다. -c 옵션을 사용한다. 아래의 예시를 보자.

# 파일 내용 확인
cat test.txt
abc 123
hij 456
abc 123
abc 234

# 중복 회수 확인(-c 옵션)
cat test.txt | uniq -c
  1 abc 123
  1 hij 456
  1 abc 123
  1 abc 234

# 정렬
cat test.txt | sort
abc 123
abc 123
abc 234
hij 456
hij 234

# 중복 회수 확인(sort와 조합)
cat test.txt | sort | uniq -c
  2 abc 123
  1 abc 234
  1 hij 234
  1 hij 456

uniq에 옵션을 붙이지 않으면 중복된 행을 제거하고 출력한다. 단순 중복 제거는 sort, awk를 이용하는 방법이 더 효율적일 수 있다. 이전 게시물을 참고하자. 여기로

 

# 중복 제거
cat test.txt | sort | uniq
abc 123
abc 234
hij 234
hij 456

만약 중복이 발생한 행만 골라서 출력하고 싶다면 -d 옵션을 사용한다.

# 중복이 발생한 행만 출력(-d 옵션)
cat test.txt | sort | uniq -d
abc 123

중복이 발생하지 않은 행만 골라서 출력하고 싶다면 -u 옵션을 사용한다.

# 중복이 발생하지 않은 행만 출력(-u 옵션)
cat test.txt | sort | uniq -u
abc 234
hij 234
hij 456

비교할 때 정해진 수 만큼의 필드를 건너뛸 수도 있다. -f 옵션을 사용한다. 맨 앞에서 부터 몇개의 필드를 건너뛰고 중복을 확인할 것인지 정할 수 있다. 필드는 공백(space) 또는 탭(tab)에 의해 구분된다(공백이 연속해서 나오면 하나의 공백으로 간주된다). 예를 들어 위의 예시에서 두번째 항목만을 기준으로 중복 여부를 확인하려면 -f 1 이렇게 된다. sort 명령에서도 -k 옵션을 이용해서 두번째 필드를 기준으로 정렬하면 된다.

 

# 맨 앞 1개의 필드를 건너 뛰고(-f 1), 중복이 발생하지 않은 행만 골라서 출력(-u)
cat test.txt | sort -k 2 | uniq -f 1 -u
hij 456

위의 결과를 보면, 앞의 1개 필드를 건너 뛰고 비교를 했기 때문에 test.txt 파일에서 "abc 234"와 "hij 234"가 중복으로 간주되었다.

만약, 위의 예시에서 앞에 있는 첫번째 필드만 기준으로 중복을 확인하고, 두번째 필드는 무시하려면 어떻게 해야 할까? -f 옵션이 앞쪽의 필드만 건너뛸 수 있으므로 rev 명령과 조합하는 방법을 생각해 볼 수 있다.

# 첫번째 필드 기준으로 중복 확인, 중복이 발생한 행만 골라서 출력
cat test.txt | sort | rev | uniq -f 1 -d | rev
abc 123
hij 234

또 한가지 방법은 awk 명령을 이용해서 필드의 순서를 바꾼 후에 uniq 명령을 사용하는 것이다.

# 첫번재 필드 기준으로 중복 확인, 중복이 발생한 행만 골라서 출력
cat test.txt | sort | awk '{ print $2 " " $1 }' | uniq -f 1 -d | awk '{ print $2 " " $1 }'
abc 123
hij 234

 

728x90
Posted by 반달가면