2013-06-08 3 views
6

이 파일이 있다고 해봅시다.리눅스 정렬 명령으로 복수 키로 정렬

$ cat a.txt 
c 1002 4 
f 1001 1 
d 1003 1 
a 1001 3 
e 1004 2 
b 1001 2 

두 번째 열로 정렬 한 다음 세 번째 열로 정렬하려고합니다. 두 번째 열은 숫자이며, 세 번째 열은 문자열로 처리 할 수 ​​있습니다. 나는 다음 명령이 잘 작동한다는 것을 안다.

$ sort -k2,2n -k3,3 a.txt 
f 1001 1 
b 1001 2 
a 1001 3 
c 1002 4 
d 1003 1 
e 1004 2 

그러나 나는 그렇다고 생각하지만 sort -k2n a.txt도 작동해야합니다.

$ sort -k2n a.txt 
a 1001 3 
b 1001 2 
f 1001 1 
c 1002 4 
d 1003 1 
e 1004 2 

열 2로 정렬 한 다음 열 3 대신에 1을 정렬하는 것과 같습니다. 왜 이런 일이 일어나는 걸까요? 벌레인가 아닌가? 위의 데이터는 숫자가 고정 너비이므로 원인은 sort -k2 a.txt입니다.

내 정렬 버전은 cygwin에서 sort (GNU coreutils) 8.15입니다.

+0

흥미 롭습니다. 'sort -k2 a.txt'는 * this * case에서 작동합니다. '-k2'는 필드 2에서 시작하여 줄 끝까지 키를 사용하여 정렬하도록 지시합니다. '-k2n'은 필드 2를 숫자 순서로 정렬하도록 알려줍니다. 필드 2와 3 사이의 공백 문자를 만나면 정렬 키가 끝난다는 것을 의미합니다. 정렬에 대한 버전을 어딘가에 붙여 넣는 것이 좋습니다. –

+0

'sort (GNU coreutils) 8.5 '를 사용하여 설명 된 동작을 데비안 안정적으로 재현 할 수 있습니다. – alk

+0

@ MikeSherrill'Catcall '숫자가 아닌 값을 숫자로 정렬하려고하면 sort (1)이 문자열 정렬로 돌아갑니다. ''1001 3 "'등은'-k2n'과 같이 * not * 숫자입니다. – PointedEars

답변

9

이주의 사항은 GNU sort docs입니다.

두 번째 필드에서 숫자 순으로 정렬하고 필드 5의 세 번째 및 네 번째 문자를 알파벳 순으로 정렬하여 관계를 해결하십시오. 필드 구분 기호로 ':'을 사용하십시오. 대신 -k 2,2n 종류의 -k 2N 쓴 경우 모든 문자 두 번째 필드에 시작하여 기본 숫자 키와 같은 라인의 끝에 연장 사용했을 것으로

 sort -t : -k 2,2n -k 5.3,5.4 

참고. 응용 프로그램의 대다수의 경우 두 개 이상의 필드에 걸쳐있는 키를 숫자 으로 처리하면 예상 한대로 작동하지 않습니다.

숫자 키로 '1001 3'을 평가할 때 최종 결과가 확실하지 않지만 '예상 한대로되지 않습니다'라는 내용이 정확합니다. 해야 할 일은 각 키를 독립적으로 지정하는 것입니다.

동일한 웹 페이지에서 "동점"을 해결하는 방법에 대해 설명합니다.

마지막으로, 모든 키가 동일한 비교 최후의 수단으로 정렬 --reverse 이외의 정렬 옵션 (-r) 지정된 없다면로 전체 라인을 비교합니다.

나는 그것을 해석하는 방법에 대해 조금 신비 해졌다.

+0

마지막 단락은 가장 확실하게, 지정된 모든 키의 값이 동일하다고 간주되는 sort (1)은 줄에서 간단한 문자열 비교를 사용하고, 지정된 경우 --reverse (또는 -r) 만 관찰한다는 것을 의미합니다. 예를 들어'foo : 42 : bar : baz : blabla'와'foo : 42 : baz : bar : blabla' 행이있는 경우,''bar ''' ''baz ''를 사용하고'-r'을 사용하면 그 반대입니다. – PointedEars

+0

감사합니다 @ 마이크의 노력. 나는 정렬 문서가 약간을 설명한다고 생각한다. 하나 이상의 필드에 걸쳐있는 키를 숫자로 처리하는 것에주의해야합니다. – yejinxin

+0

@PointedEars : 그 행동을 설명 할 것이라고 생각합니다. 먼저 키순으로 정렬 한 다음 전체 줄로 정렬하십시오. 물론 전체 라인은 첫 번째 필드에서부터 시작됩니다. –