sort 명령과 관련된 예외를 우연히 발견했지만 왜 이런 일이 발생하는지 설명을 찾을 수 없습니다.
다음 명령을 실행하십시오.
cat ~/.bash_history | uniq -c | sort -h -r | head
시스템에서 실행한 가장 일반적인 10개의 명령 시퀀스를 출력하도록 되어 있지만 대신에 실패하고 출력이 마치 한꺼번에 실행한 것처럼 나타납니다.
그러나 실행할 때:
cat ~/.bash_history | sort | uniq -c | sort -h -r | head
작동하는 것 같지만 이유를 이해할 수 없습니다. 누군가 설명할 수 있습니까?
답변1
uniq
필터만가까운철사. 다음과 같은 파일이 있다고 가정해 보겠습니다.
$ cat foobar.txt
foo
bar
foo
인접하지 않은 두 개의 선이 있습니다 foo
. 그런 다음 각 파일은 uniq -c
한 번 계산되는 반면, 파일을 먼저 정렬한다는 것은 해당 uniq -c
파일을 인접한 것으로 처리하고 두 번 나타나는 줄로 계산하는 것을 의미합니다.
$ uniq -c foobar.txt
1 foo
1 bar
1 foo
$ sort foobar.txt | uniq -c
1 bar
2 foo
답변2
uniq
POSIX 유틸리티입니다. 당신은 그것을 사용했고 uniq -c
다음과 같이 작동합니다 :
이
uniq
유틸리티는 비교를 위해 입력 파일을 읽어야 합니다.가까운행을 작성하고 출력에 각 입력 행의 복사본을 씁니다. 두 번째 및 후속 사본 복제가까운입력 라인을 작성하면 안 됩니다. 비교할 때 입력의 각 줄 끝은 무시되어야 합니다.입력의 중복 행이 인접하지 않은 경우 감지되어서는 안 됩니다.
[…]
-c
각 출력 라인 앞에 입력에서 해당 라인이 나타나는 횟수를 추가합니다.
(원천, 강조 내)
즉, 인접하지 않은 선은 다른 선으로 간주됩니다. 귀하의 사용 사례에서는 sort
먼저 동일한 선을 인접하게 만들어야 합니다 . 그래야만 uniq
하고 싶은 일을 할 수 있을 것이다.