Home » OS » 리눅스 » 리눅스 uniq 명령어를 알아봅시다.

리눅스 uniq 명령어를 알아봅시다.

리눅스에서 uniq 명령어는 중복된 내용이 있으면 이를 제거해 주는 명령어입니다. 이 명령어가 제대로 동작하기 위해서는

  • sort 를 해야 합니다.
    • sort 가 단순히 특정 기준으로 정렬하는 것도 있지만
    • 같은 값을 인접한 위치에 묶는 역할도 하기 때문입니다.
  • 이 uniq가 인접한 값이 같으면 제거하는 logic으로 수행됩니다.

이 말이 어떤 의미인지 세세히 보도록 하겠습니다.


리눅스 uniq 명령어 사용해 보기

먼저, 해당 명령어의 설명을 보겠습니다.

[그림 1] 명령어에 대한 설명

report or omit 이라고 되어 있는데요. omit은 제거하는 것입니다. 즉, 반복되는 line에 대해, 결과를 제거하게 됩니다.

[그림 2] 1.txt에 있는 내용

1.txt에 있는 내용을 보겠습니다. 1, 3, 1, 2, 5, 6, 1000, 1, 1, 5, 1, 1, 1이 있습니다. 여기서 반복되는 것은, 1000 밑에 있는 1 2개와, 5 밑에 있는 1 3개입니다. 이 반복되는 부분들을 제거해 줍니다.

[그림 3] cat과 uniq를 연결한 결과

보면, 1, 3, 1, 2, 5, 6, 1000까지는 그대로 출력됩니다. 그 다음에 1이 2번 반복되는 부분과, 5 뒤에, 1이 3번 반복되는 부분이 1 1번으로 대체되었음을 볼 수 있어요. 이는, repeat가 되는 부분을 omit 한 것이라고 할 수 있어요.

[그림 4] uniq의 몇 가지 옵션들

uniq의 몇 가지 옵션들을 더 봅시다.

  • -c
    • 해당 값이 나오는 빈도 수를 셉니다.
  • -d
    • 반복이 되는 값만 출력합니다.
    • 해당 옵션의 반대는 -u가 있습니다.

해당 옵션들은 밑에서 써 보도록 하겠습니다.


정렬을 하고 써 보기

그런데, 이런 경우를 생각해 봅시다. 예를 들어 수로만 이루어진 파일이 있다고 해 봅시다. 각 수들이 몇 번 나오는 지 빈도수를 알고 싶어요. 어떻게 해야 하나요? 이 경우 sort를 먼저 해 줘야 합니다. 왜냐하면

  • uniq는 인접한 같은 값들을 제거하는데
  • sort는 같은 값을 서로 인접하게 모아주는 역할을 하기 때문

입니다. sort를 써 봅시다.

[그림 5] 결과를 sort 하기

sort를 하면, 1이 모두 인접하게 모여 있지요. 2개가 있었던 5 역시 인접하게 모여 있어요. 이를 가지고, uniq를 돌려보면 아래와 같아요.

[그림 6] sort 후 쓰기

어떤가요? 1, 1000, 2, 3, 5, 6이 나오지 않았나요? 리눅스 uniq 명령어를 보통, 중복된 값을 제거하기 위해 많이 쓸 텐데요. 해당 의도로 명령어를 실행시키려는 경우, sort가 되어 있어야 해요. 그런데 말입니다. 1 다음에 1000이 오는 건 조금 이상해 보입니다.

이는, 정렬 기준이 수가 아닌, 문자열이기 때문인데요.

[그림 7] 정렬 명령어의 옵션

정렬 명령어의 옵션을 보면, -n을 주면, numeric sort를 할 수 있다고 되어 있어요.

[그림 8] 정수 정렬 후에 쓰기

따라서, cat 1.txt와, sort에 -n 옵션을 붙인 것과, uniq를 piping 하면, 1, 2, 3, 5, 6, 1000이 제대로 나오게 됩니다. 이 점 기억하시면 됩니다.


예제 몇 가지

먼저, 모든 예제에 사용되는 1.txt는 아래 조건을 만족해요.

  • 한 줄에는 하나의 수만 있습니다.
  • 0 ~ 9와 부호를 나타내는 – 이외의 문자는 없습니다.
  • leading zero는 없습니다. 0 제외하고.

이제, 예제 1번을 봅시다. 파일에 수가 여러 개 있는데, 중복된 수는 하나로 취급해야 해요. 몇 가지 수가 나왔는지 체크하고 싶어요.

  • 일단 sort를 해야 합니다.
  • 그리고 uniq를 해야 겠네요.
  • 각 수들이 line 형태로 나오니까, wc 명령어를 써야 겠군요.

이 셋을 piping 해 볼까요?

[그림 9] 예제 1번 명령어

wc에서 -l 옵션을 line 수를 셉니다. uniq까지 한 결과가 1, 2, 3, 5, 6, 1000이 나왔습니다. 6개의 line으로 나왔고, 우리는 이 라인수만 세면 되기 때문에, wc -l을 추가로 piping 한 것입니다.

다음 2번째 예제. 각 수가 몇 번 나왔는지 체크하고 싶습니다.

  • 그러면 sort는 해야 하고
  • 다음 uniq에 -c만 붙이면 되겠네요.
[그림 10] 예제 2번 명령어

이 -c 옵션은 빈도수까지 출력합니다. 1이 7번 나오고, 5가 2번 나왔다는 정보가 같이 출력 되었습니다.

이제 마지막. 예제 3번. 2번 이상 나온 수와, 1번만 나온 수는 어떻게 출력할까요? 이거는, uniq에서 처리하는 것이기 때문에

  • sort를 하고
  • 리눅스 uniq 처리 단계에서
    • 2번 이상 나온 수만 출력하려는 경우 -d를
    • 1번만 나온 수를 출력하려는 경우 -u를 옵션으로 주면 됩니다.
[그림 11] 예제 3번 명령어

따라서 위와 같이 처리하면 됩니다.

Leave a Comment

17 − 6 =