uniq가 충분히 고유하지 않은 이유는 무엇입니까? uniq --unique는 어떻습니까?

uniq가 충분히 고유하지 않은 이유는 무엇입니까? uniq --unique는 어떻습니까?

다음 임의 파일의 명령은 다음과 같습니다.페이스트빈:

wget -qO - http://pastebin.com/0cSPs9LR | wc -l
350
wget -qO - http://pastebin.com/0cSPs9LR | sort -u | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq | wc -l
287
wget -qO - http://pastebin.com/0cSPs9LR | sort | uniq -u | wc -l
258

매뉴얼 페이지에는 이 -u플래그의 기능이 명확하지 않습니다. 어떤 제안이 있으십니까?

답변1

uniqwith는 -u중복된 행을 건너뜁니다. 그러므로:

$ printf "%s\n" 1 1 2 3 | uniq
1
2
3
$ printf "%s\n" 1 1 2 3 | uniq -u
2
3

일반적으로 uniq행은 최대 한 번 인쇄됩니다(입력이 정렬되어 있다고 가정). 이 옵션은 실제로 실제 줄을 인쇄합니다.고유한(다시 나타나지 않았습니다).

답변2

간결한 버전:

  • uniq, 없이 -u, 각 행을 만듭니다.산출고유한.
  • uniq -u모든 고유 라인만 인쇄입력에서.

약간 더 긴 버전:

uniq반복되는 줄이 있는 파일을 처리하는 데 사용되며 이러한 줄이 입력에 연속적으로 나타나는 경우에만 사용됩니다. 그러므로 그 목적을 위해,고유한행은 즉시 복사되지 않는 행입니다.

( uniq단기 기억은 매우 제한적입니다. 이전 줄이 아닌 한 입력에 이전 줄이 나타났는지 여부를 결코 기억하지 않습니다. 이것이 바로 uniq와 자주 쌍을 이루는 이유입니다 sort.)

일련의 반복되는 줄이 나타나면 매개변수 uniq없이 -u인쇄됩니다.하나라인의 사본. (각 출력 라인을 만듭니다.고유한).

매개변수를 전달하면 -u인쇄됩니다.라인 사본 - 중복 실행은 출력에서 ​​생략됩니다.

답변3

고유 POSIX 사양매우 명확하게 설명되어 있습니다.

-u
    Suppress the writing of lines that are repeated in the input.

-umake 옵션은 uniq중복된 행을 인쇄하지 않습니다.

대부분의 uniq구현에서는 바이트 비교를 사용하는 반면 GNU는 uniq데이터 정렬을 사용하여 중복 행을 필터링합니다. 따라서 en_US.UTF-8다음과 같은 일부 로케일에서는 잘못된 결과가 발생할 수 있습니다.

$ printf '%b\n' '\U2460' '\U2461' | uniq

어떤 줄도 제공 되지 -u않습니다.

$ printf '%b\n' '\U2460' '\U2461' | uniq -u
<blank>

따라서 C바이트 비교를 수행하려면 로케일을 설정해야 합니다.

$ printf '%b\n' '\U2460' '\U2461' | LC_ALL=C uniq

답변4

정상:

echo "a b a b c c c" | tr ' ' '\n'
a
b
a
b
c
c
c

uniq: 두 개의 연속된 중복 행이 없습니다.

echo "a b a b c c c" | tr ' ' '\n' | uniq
a
b
a
b
c

정렬됨

echo "a b a b c c c" | tr ' ' '\n' | sort
a
a
b
b
c
c
c

sort -u: 두 행이 반복되지 않습니다.

echo "a b a b c c c" | tr ' ' '\n' | sort -u
a
b
c

정렬/고유성: 모두 다름

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq
a
b
c

별개의 발생 횟수 계산

echo "a b a b c c c" | tr ' ' '\n' | sort | uniq -c
2 a
2 b
3 c

고유한 행만(먼저 정렬하지 않음)

echo "a b a b c c c" | tr ' ' '\n' | uniq -u
a
b
a
b

고유한 행만(정렬 후)

echo "a b a b c c c Z" | tr ' ' '\n' | sort | uniq -u
Z

uniq -d : 그룹당 하나씩 중복된 줄만 인쇄합니다.

echo "a b a b c c c" | tr ' ' '\n' | uniq -d
c

..괜찮아요

echo "a b a b c c c" | tr ' ' '\n' | uniq -dc
3 c

관련 정보