Bash 숫자 정렬은 동시에 열을 선택할 때와 동시에 열을 선택할 때 다른 결과를 제공합니다.

Bash 숫자 정렬은 동시에 열을 선택할 때와 동시에 열을 선택할 때 다른 결과를 제공합니다.

다음 예제 데이터의 경우 두 열 모두 숫자이지만 두 번째 열의 자릿수가 다릅니다.

2 9
1 1000
1 50
3 0

두 개의 열을 기준으로 정렬하고 싶습니다. 숫자 플래그를 사용하여 개별적으로 지정하면 -n원하는 결과가 생성됩니다.

sort -n -k1,1 -k2,2 num.data.txt

주어진

1 50
1 1000
2 9
3 0

이것이 내가 원하는거야.

하지만,

sort -n -k1,2 num.data.txt

알파벳순으로 정렬된 것으로 보이는 데이터가 있는 경우:

1 1000
1 50
2 9
3 0

이는 두 개의 열만 있는 것과 동일하다는 것을 알고 있지만 sort -n -k1,2 num.data.txt(동일한 결과 제공) 실제로 작업 중인 데이터에는 더 많은 열이 있습니다.sort -n num.data.txt

두 방법 사이에 왜 이러한 차이가 있습니까?

답변1

주요 -k1,2사양 지정하나키는 첫 번째 열의 시작 부분에서 시작하고(기본 열 구분 기호는 공백이 아닌 공백에서 공백으로의 전환이기 때문에 선행 공백 포함) 두 번째 열의 끝에서 끝납니다.

이것이 단지 것임을 깨닫는 것이 중요하다하나열쇠. 두 개의 키가 필요한 경우 두 가지 -k옵션이 필요합니다. 정렬할 때 문자열은 숫자 와 비교 sort됩니다 . 숫자 비교의 경우 이러한 문자열은 유효한 숫자처럼 보이는 선행 부분을 고려하여 숫자로 변환됩니다(선행 공백은 무시됩니다). 그래서 우리는 과 를 비교할 것입니다 . 동일하므로 대체 정렬을 되돌려 전체 행의 어휘 비교인 관계를 결정합니다."1 50""1 1000"11sort

와 비교한 -n -k1,1 -k2,2다음 동점 이므로 두 번째 키( vs )를 고려합니다. 이는 숫자 정렬 ( 첫 번째 필드에서 시작하여 행 끝에서 끝나는 키를 지정하는 경우 전체 행과 동일) 이기 때문에 작동합니다 .sort"1""1"" 50"" 1000"-n -k1 -k2-k1

관련 정보