2017-03-01 1 views
1

동료가 오늘 sort 명령으로 이상한 동작을 감지했으며,이 명령 출력이 의도적인지 여부를 아는 사람이 있는지 궁금합니다. 파일을 감안할 때Bash sort -nu는 예기치 않은 동작을 초래합니다.

:

ABC_22 
ABC_43 
ABC_1 
ABC_1 
ABC_43 
ABC_10 
ABC_123 

우리는 숫자 정렬을 사용하여 파일을 정렬하고 또한 고유하게 찾고 있습니다, 그래서 우리는 실행

sort file.txt -nu 

출력은 다음과 같습니다

ABC_22 

이제는 선이 숫자로 시작하지 않기 때문에 숫자 정렬이 작동하지 않는다는 것을 알고 있습니다. 이 큰 스크립트의 한 부분),하지만 난의 라인을 따라 뭔가 더 기대했을 것이다 : 그렇지 않은 이유를

ABC_1 
ABC_10 
ABC_123 
ABC_22 
ABC_43 

사람이 알고 있나요

? 정렬은 -u 또는 -n 옵션을 개별적으로 지정하면 예상대로 작동합니다.

답변

1

당신은

sort -nu -t'_' -k2 file 
ABC_1 
ABC_10 
ABC_22 
ABC_43 
ABC_123 

플래그로 GNU sort의 두 번째 필드에 드 제한을 지정 누락을 -n 숫자 계열의 경우 고유 한 행의 경우 -u이고 키의 경우 부분은 디 리미터를 _으로 설정하고 _을 완료 한 후 두 번째 필드를 -k2으로 정렬하는 것입니다.

1
-n

, an empty number is zero : 정렬 숫자

. 숫자는 각 행을 시작하며 선택적인 공백, 선택적 '-'부호 및 0보다 큰 숫자 (예 : )를 천 단위 구분 기호로 구분하고, 선택적으로 뒤에 소수점 문자와 0 이상의 숫자로 구성됩니다. 빈 번호는 이며 '0'으로 처리됩니다.

이 모든 행은 행의 시작 부분에 빈 번호가 있으므로 sort의 고유성에 대해서는 모두 0입니다. 같은 번호로 각 줄을 시작했다면, 예를 들어 1으로 말하면 효과는 같습니다. 명시 적으로 숫자를 포함하는 필드를 지정하거나 버전 정렬 (-V)를 사용한다 :

$ sort -Vu foo 
ABC_1 
ABC_10 
ABC_22 
ABC_43 
ABC_123 
관련 문제