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가 최종 출력에 포함되지 않는 이유를 이해할 수 없습니다. 라인과 라인 B
이 bbb 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