uniq -f 1을 사용하면 예상치 못한 결과가 발생합니다.

uniq -f 1을 사용하면 예상치 못한 결과가 발생합니다.

ubuntuforums.org에 질문을 했지만 만족스러운 답변을 얻지 못한 후 여기 Ask Ubuntu에서 다시 질문하기로 결정했습니다. 매우 상세한 답변이 필요합니다. 구체적으로 알아야 할 점어느라인이 비교됩니다매번다음 두 가지 예에서는 uniq를 사용하여 한 줄이 인쇄됩니다.

파일1.txt:

$ cat -A file1.txt
aaa^Iupc$
b$
c$
aaa^Iztp$
b$
c$
C$
A$
B$
B$
b$

$ sort file1.txt | uniq -f 1
A
aaa    upc
aaa    ztp
b

및 file2.txt:

$ cat -A file2.txt
aaa^Iupc$
b$
c$
aaa^Iztp$
b$
c$
C$
A$
B$
B$
bbb^Ixpz$

$ sort file2.txt | uniq -f 1
A
aaa    upc
aaa    ztp
b
bbb    xpz
c

두 번째 예가 혼란스러워요. 대문자 B가 최종 출력에 포함되지 않는 이유를 이해할 수 없습니다. 라인과 라인 Bbbb xpz서로 인접해 있다는 점 을 고려하면 대문자 B 라인이 인쇄되어야 하지 않나요 ? 만약에:

B ---> (empty)

그리고

bbb ---> xpz

빈 값이고 xpz둘 다 고유하므로 두 줄을 모두 인쇄해야 합니다. 아니면 내가 뭔가를 놓치고 있는 걸까?

답변1

답은 정렬 순서와 를 사용하는 동안 uniq주어진 필드 번호( )보다 작은 경우 필드 값을 사용하는 방법에 있습니다 .N-f N

보시다시피 ASCII 문자 세트가 있으므로 정렬 순서를 훨씬 예측할 수 있습니다.

% sort file.txt            
A
aaa upc
aaa ztp
b
b
B
B
bbb xpz
c
c
C

uniq -f 1이제 확인하는 동안 각 줄의 (공백으로 구분된) 첫 번째 필드를 건너뛰고 고유한 줄을 얻어 보겠습니다 .

% sort file.txt | uniq -f 1
A
aaa upc
aaa ztp
b
bbb xpz
c

이제 주목해야 할 중요한 점은 uniq언급된 필드보다 적은 필드(이 경우 1)가 있는 줄에 null 문자열을 사용한다는 것입니다. 따라서 필드가 하나만 있는 모든 줄은 필드가 2개보다 큰 다른 줄과 비교할 때 다른 필드에 대해 null 문자열이 있는 것으로 처리됩니다.

따라서 sort file2.txt출력에서 ​​다음을 수행합니다.

b
b
B
B

모두 동일하게 처리되고 포함된 첫 번째 줄만 b보존되므로 b출력에 이 표시됩니다.

마찬가지로, 다음에서:

c
c
C

첫 번째 항목만 의 출력 c으로 종료됩니다 uniq.

답변2

다음은 프로세스를 진행하는 데 도움이 될 수 있는 표입니다.

----------------+---------------+----------+----------------+
    sort        |     Remove    | Adjacent |                |
 (C locale)     |    field #1   |  match?  |    Output      |
----------------+---------------+----------+----------------+
A               |               |    N*    |A               |
B               |               |    Y     |                |
B               |               |    Y     |                |
C               |               |    Y     |                |
aaa     upc     |   upc         |    N     |aaa     upc     |
aaa     ztp     |   ztp         |    N     |aaa     ztp     |
b               |               |    N     |b               |
b               |               |    Y     |                |
bbb     xpz     |   xpz         |    N     |bbb     xpz     |
c               |               |    N     |c               |
c               |               |    Y     |                |
----------------+---------------+----------+----------------+
* the first line has no adjacent above, so is always output

관련 정보