매뉴얼 페이지에 따르면 sort 명령의 --numeric-sort 옵션에 대한 설명이 다음과 같습니다.
-n, --numeric-sort
compare according to string numerical value
문자열 숫자 값이란 각 문자열 문자의 ASCII 값을 연속적으로 비교하는 것을 의미한다고 가정합니까?
정보 페이지 읽기
‘-n’
‘--numeric-sort’
‘--sort=numeric’
Sort numerically. The number begins each line and consists of
optional blanks, an optional ‘-’ sign, and zero or more digits
possibly separated by thousands separators, optionally followed by
a decimal-point character and zero or more digits. An empty number
is treated as ‘0’. The ‘LC_NUMERIC’ locale specifies the
decimal-point character and thousands separator. By default a
blank is a space or a tab, but the ‘LC_CTYPE’ locale can change
this.
Comparison is exact; there is no rounding error.
Neither a leading ‘+’ nor exponential notation is recognized. To
compare such strings numerically, use the ‘--general-numeric-sort’
(‘-g’) option.
두 문서를 모두 읽은 후에도 -n 옵션이 사용하는 데이터 정렬에 대한 명확한 설명을 여전히 볼 수 없습니다.
--numeric-sort 옵션은 기본 옵션과 어떻게 다릅니까? 내 순진한 추측은 숫자가 문자보다 우선한다는 것입니다. 그러나 문서에서는 이것을 읽지 않았습니다.
이를 명확하게 설명하는 문서는 무엇입니까? 즉, 문서를 참조하여 이 정보를 어디에서 찾을 수 있습니까?
답변1
숫자가 여러 개인 경우 sort -n
고려하십시오 .모두번호; 기본적으로 이 파일
3
2
1
20
30
다음과 같이 정렬됩니다.
1
2
20
3
30
이것은 당신이 원하는 것이 아닐 수도 있습니다. 을 사용하면 -n
다음을 얻을 수 있습니다.
1
2
3
20
30
숫자 정렬에서는 음수, 소수점 및 천 단위 구분 기호(로케일에 따라 결정됨)도 처리합니다. 뒤에 "숫자가 아닌" 텍스트가 있으면 정렬 순서에서 무시됩니다. 만약 라인시작숫자가 아닌 콘텐츠의 경우 해당 줄은 0으로 계산됩니다.
보다 정확하게는 논리는 다음과 같습니다. (기본) 정렬 키는 다음과 같습니다.초기 숫자 문자열. (즉, "각 줄에서 숫자가 시작됩니다.") 문자열은 가능한 공백, 빼기 기호,0개 이상의 숫자, 그리고 아마도 .
그리고 ,
(또는 다른 것). 후행 문자는 고려되지 않습니다."숫자"의 일부가 아닙니다.. 줄이 숫자로 시작하지 않으면 다음과 같이 처리됩니다.보이지 않는("비어 있음") 0과 같은 숫자입니다. (또는 "숫자가 0인 숫자.")
따라서 "숫자"를 정렬한 후(주어진 정렬 키를 사용하여 비교 -k
) 남은 행이 있으면 해당 행을 정렬합니다.기본 정렬 사용. (즉, 1a
이전 1b
과 1a20
이전 입니다 1a3
.)모두행은 이런 방식으로 정렬되지만 정렬 키 이외의 행은 정렬되지 않습니다. 이 경우 이상한 동작이 발생합니다( 0cookies
sort앞으로 biscuits
- 2차 정렬의 경우 "보이지 않는 0"이 추가되지 않습니다.
일반적으로 -n
숫자로 구성된 행(또는 필드)을 정렬하려는 경우에 사용됩니다.숫자가 아닌 항목이 많거나 숫자가 다른 문자열과 혼합된 경우에도 일관된 결과를 얻을 수 있지만 원하는 결과가 아닐 수도 있습니다.
선호하는 문자와 숫자(그리고 두 가지를 모두 포함하는 줄)를 혼합하면 -V
다음과 같이 됩니다.버전 정렬~에 따르면특별한 규칙문자열을 논리적 구성 요소로 나눕니다. 하지만 이렇게 하면 주의하세요.1.10
더 높은비교하다 1.9
.
답변2
기본적으로 sort
문자는 로케일에 지정된 정렬 순서를 사용하여 정렬됩니다. 일반적으로 이는 ASCII 순서와 매우 유사하지만 지역적으로 약간의 차이가 있을 수 있습니다. 매뉴얼 페이지에서:
*** WARNING *** The locale specified by the environment affects sort order.
Set LC_ALL=C to get the traditional sort order that uses native byte values.
기본 바이트 값은 일반적으로 ASCII 값을 나타내므로 숫자가 대문자 앞에, 대문자가 소문자 앞에 옵니다. 그러나 정렬은 여전히 문자별로 이루어지므로 먼저 나타 10
납니다 .2
1
2
-n
or 옵션이 지정 되면 --numeric-sort
연속된 숫자는 단일 문자가 아닌 숫자로 처리되며 숫자에 따라 가장 작은 것부터 가장 큰 것까지 정렬됩니다.
문서에는 세부 사항이 완전히 명확하지 않으므로 실험을 통해 파생된 플래그 지정 규칙은 다음과 같습니다 -n
.
- 숫자로 시작하는 행은 숫자순으로 정렬됩니다(작은 숫자부터)
- 숫자 라인의 후행 문자는 숫자 부분에 영향을 주지 않지만, 숫자 부분이 동일한 경우 후행 문자는 영숫자순으로 정렬됩니다.
- 숫자가 아닌 것으로 시작하는 줄은 0으로 정렬된 다음 규칙 2로 정렬됩니다.
관찰하다:
$ printf %s\\n 2z 111 10 20b 20a aa2 aa10 | sort -n
aa10
aa2
2z
10
20a
20b
111
규칙 3에 따르면 행 aa10
합계는 aa2
0으로 처리되고 나머지 문자(문자로 처리되는 숫자 포함)를 기준으로 정렬됩니다.
규칙 2에 따르면 행 2z
, 20a
및 20b
은 숫자로 처리되며 후행 문자는 숫자가 동일한 경우에만 적용됩니다.
규칙 1에 따르면 숫자로 시작하는 모든 줄은 숫자순으로 정렬됩니다.
플래그가 없으면 -n
문자별로 정렬이 수행되며, 숫자는 알파벳 문자 앞에 옵니다. 관찰하다:
$ printf %s\\n 2z 111 10 20b 20a aa2 aa10 | sort
10
111
20a
20b
2z
aa10
aa2