답변:
sort다음 옵션과 함께 명령 을 사용할 수 있습니다 --unique.
sort -u input-file
표준 출력 대신 FILE에 결과를 쓰려면 다음 옵션을 사용하십시오 --output=FILE.
sort -u input-file -o output-file
명령 uniq을 적용 할 수도 있습니다. 이 경우 동일한 줄이 결과적이어야하므로 입력에 대한 사전 정렬 이 필요합니다. 이 메모에 대한 @RonJohn 덕분에 다음 과 같습니다 .
sort input-file | uniq > output-file
sort비슷한 이유로 인해 비슷한 경우에 대한 명령이 마음에 들지만 큰 배열로 작업하는 경우 awkJohn1024의 답변에 의한 접근 방식 이 더 강력 할 수 있습니다. 다음은 거의 5 백만 줄의 파일 (위의 예를 기반으로)에 적용 된 언급 된 접근법 간의 시간 비교입니다.
$ cat input-file | wc -l
20000000
$ TIMEFORMAT=%R
$ time sort -u input-file | wc -l
64
7.495
$ time sort input-file | uniq | wc -l
64
7.703
$ time awk '!a[$0]++' input-file | wc -l # from John1024's answer
64
1.271
$ time datamash rmdup 1 < input-file | wc -l # from αғsнιη's answer
64
0.770
다른 중요한 차이점은 @Ruslan 이 언급 한 것입니다 .
sort -u이awk명령은 입력이 종료 된 후에 만 결과를 인쇄하지만이 명령은 새로운 각 결과 행을 즉시 인쇄합니다 (파일보다 파이프 입력의 경우 더 중요 할 수 있음).
그림은 다음과 같습니다.
위의 예에서 루프 (아래에 표시됨)는 각각 길이가 3자인 문자 AD의 500 개의 임의 조합을 생성합니다. 이 조합은 awk또는 로 파이프됩니다 sort.
for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done
sort input-file | uniq!!!!
출력 라인을 입력 라인과 동일한 순서로 유지하려면 다음을 사용하십시오.
$ awk '!a[$0]++' file
SO4
HOH
CL
BME
작동 방식 :
이것은 연관 배열 a을 사용 하여 각 줄이 이전에 본 횟수를 계산합니다. 이전에 보이지 않았 으면 라인이 인쇄됩니다.
awk만 sort -u쉬운 방법입니다.
sort -u아니라 가장 느린 방법입니다. :) 두 가지 방법 사이의 시간 비교로 답변을 업데이트했습니다.
sort -u입력이 종료 된 후에 만 결과를 인쇄하는 반면이 awk명령은 새로운 결과 행을 즉시 인쇄합니다 (파일보다 파이프 입력에 더 중요 할 수 있음).
awk솔루션은 읽기 쉽지는 않지만 매우 좋은 솔루션 이라고 고백해야합니다 sort.