uniq는 중복된 행을 표시합니다.

uniq는 중복된 행을 표시합니다.
$ grep home american.txt | sort | uniq                                                                                            
A home and a country should leave us no more!                                                                                        
Between their loved home and the war's desolation!                                                                                 
O'er the land of the free and the home of the brave!                                                                                  
O'er the land of the free and the home of the brave!                                                                                  
O'er the land of the free and the home of the brave?     

두 개의 중복 행이 표시되는 이유는 무엇입니까?

출력은 다음과 같습니다 grep home american.txt | cat -A.

O'er the land of the free and the home of the brave?^M$
O'er the land of the free and the home of the brave!^M$
A home and a country should leave us no more! ^M$
O'er the land of the free and the home of the brave!^M$
Between their loved home and the war's desolation!^M$
O'er the land of the free and the home of the brave!$

답변1

오, 자유의 땅이자 용감한 자의 집이여!

위의 줄은 세 번 나타납니다. 처음 두 항목의 끝에는 캐리지 리턴이 있습니다. 세 번째에는 그렇지 않습니다. 다음 명령을 사용하여 시각화할 수 있습니다.

고양이-A american.txt

이는 텍스트 파일 끝에 빈 줄이 없기 때문에 발생합니다.
내 생각엔 텍스트 파일 끝에 항상 빈 줄을 두는 것이 Unix/Linux 세계의 관례라고 생각합니다.

테스트 중에 발견한 다른 흥미로운 점은 다음과 같습니다.

  • 이 명령은 cygwin에서 다르게 작동합니다.
  • grep home american.txt | sort| uniq -u훌륭하게 작동합니다.

답변2

의심되는 대로데이비드 다이그리고카스두 줄은 실제로 다르지만 유일한 차이점은 보이지 않는 문자입니다.

파일은 Windows 텍스트 파일입니다. Windows 텍스트 파일에서 줄은 두 개의 문자 시퀀스 CR, LF(캐리지 리턴, 줄 바꿈)로 구분됩니다. Unix 텍스트 파일에서 줄은 LF(줄 바꿈, 줄 바꿈이라고도 함) 문자로 종료됩니다. cat -ACR ^M과 개행 문자를 표시하고 $그 뒤에 개행 문자가 표시됩니다.

Unix 유틸리티가 Windows 텍스트 파일을 처리할 때 Unix 유틸리티는 각 줄 끝에 추가 CR 문자를 표시합니다. Unix 유틸리티의 경우 CR은 일반 문자일 뿐입니다. 끝에 CR이 있는 줄은 끝에 CR이 없다는 점만 제외하면 동일한 줄과 다릅니다. 또한 Windows에서는 개행 시퀀스가 ​​구분 기호이므로 파일 끝에 CR, LF가 없습니다. 그러나 Unix에서는 텍스트 파일이 비어 있지 않는 한 항상 LF 문자로 끝납니다. 따라서 Unix 유틸리티를 사용하여 Windows 텍스트 파일을 처리할 때 Unix 유틸리티가 보는 것은 각 줄 끝에 CR이 있는 파일입니다(CR 문자는 Unix 줄 바꿈 인코딩의 일부가 아니기 때문입니다). 줄 부분이 아닌 텍스트(끝 부분에 줄 바꿈이 누락되어 있기 때문)

Unix 텍스트 유틸리티는 최종 개행 문자가 부족하여 입력이 유효한 텍스트 파일이 아닌 경우 다르게 동작합니다. GNU 유틸리티(내장되지 않은 Linux 및 Cygwin에서 찾을 수 있음)는 이러한 파일을 텍스트 파일로 처리하고 최종 줄 바꿈 부족을 유지하려고 노력합니다. 이 sort명령은 줄을 섞고, 완료되지 않은 입력 줄을 처리하는 동안 항상 출력 끝에 개행 문자를 내보냅니다. 따라서 sort이 명령에 대한 내용은 CR로 끝나지 않는 마지막 입력 줄을 제외하고 각각 CR 문자로 끝나는 여러 줄처럼 보입니다. 출력에서 마지막 입력 라인에 해당하는 라인을 제외하고 모든 라인은 CR로 끝납니다.

uniqCR로 끝나는 여러 brave!줄을 확인하고 그 중 하나만 유지하세요. 또한 CR 로 끝나지만 CR 이 없는 줄도 볼 수 있으며 brave!, 해당 줄은 다른 모든 줄과 다르기 때문에 성실하게 CR 을 내보냅니다.

터미널에서 출력을 인쇄할 때 CR 문자는 커서를 현재 줄의 시작 부분으로 이동하도록 터미널에 지시하고, LF 문자는 터미널에 커서를 다음 줄의 시작 부분으로 이동하도록 지시합니다. 따라서 LF와 CR,LF 시퀀스는 시각적으로 구별할 수 없으며 동일해 보이는 두 줄이 표시됩니다. 이 명령은 cat -A인쇄 가능한 문자를 추가하여 고유하게 만듭니다.

답변3

로 끝나는 줄에는 brave!캐리지 리턴( ^M)이 있고 다른 줄에는 없습니다. uniq예, 다릅니다.

마지막 줄을 제외한 파일의 모든 줄에는 캐리지 리턴이 있습니다. MS-DOS 또는 Windows 텍스트 편집기(유닉스의 LF 또는 \n 대신 CR/LF를 줄 종결자로 사용)로 생성되었기 때문에 이러한 기능이 있습니다. 파일의 마지막 줄에는 CR 또는 LF가 없습니다. 그렇지 않으면 아래에 빈 줄이 있습니다.

tail -1 american.txt예를 들어 개행 문자 없이 텍스트와 같은 줄에 다음 쉘 프롬프트가 표시되는 이유는 바로 이 때문입니다 .

관련 정보