GNU 데이터 정렬 및 LC_COLLATE="en_US.UTF-8"을 시도하고 있습니다. "test"라는 파일이 있습니다.
1,0 1
10 2
1,0 3
10 4
With sort -k1,2
및 simple 의 순서 sort test
는 변경되지 않습니다.
$ sort -k1,2 test
1,0 1
10 2
1,0 3
10 4
따라서 정렬은 아마도 LC_COLLATE의 일부 문제로 인해 '1,0'이 '10'과 같다고 생각합니다(구두점 건너뛰기?).
이제 :를 사용하면 sort -k1,1 -k2,2
다른 순서가 제공됩니다.
$ sort -k1,1 -k2,2 test
10 2
10 4
1,0 1
1,0 3
갑자기 정렬 시 더 이상 "10"이 "1,0"과 동일한 것으로 간주되지 않습니다.
무슨 일이에요? 이 경우에는 왜 같지 않습니까 sort -k1,1 -k2,2
? sort -k1,2
그들은 정말로 동등해야 하는가? 아니면 맨페이지를 잘못 이해한 걸까요? (coreutils 8.22 및 8.29 버전을 사용해 보았지만 둘 다 이 동작이 있습니다)
답변1
-k1,2
"1에서 2까지 모든 필드의 내용을 비교하면서 모든 행을 정렬"한다는 의미입니다. 따라서 "1,0 1"은 "10 2"와 비교됩니다.
-k1,1 -k2,2
이는 "모든 행을 정렬하고, 필드 1의 내용을 비교하고, 필드 1의 내용이 두 행에서 동일할 때 필드 2의 내용을 비교"한다는 의미입니다. 그러면 "1,0"이 "10"과 비교됩니다. "2"는 "4"와 비교됩니다.
두 경우 모두 다음에 일어나는 일은 교정, 특히 가중치 부여로 귀결됩니다. 숫자는 일반적으로 구두점이나 공백보다 더 큰 비중을 차지합니다. "1,0 1"과 "10 2"를 비교할 때 숫자가 다르기 때문에 쉼표로 인한 차이는 무시됩니다. "1,0"과 "10"을 비교할 때 유일한 차이점은 쉼표이므로 더 이상 무시되지 않습니다. 바라보다ISO 14651더 알아보기.
LC_COLLATE=C
가중치 없이 문자값만을 기준으로 정렬 하도록 설정할 수 있습니다 . 귀하의 사례는 모두 다음으로 이어질 것입니다.
1,0 1
1,0 3
10 2
10 4
"C" 로케일을 사용하는 경우.