정렬 -k1,2는 정렬 -k1,1 -k2,2와 동일합니까?

정렬 -k1,2는 정렬 -k1,1 -k2,2와 동일합니까?

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" 로케일을 사용하는 경우.

관련 정보