이 예에서는 열 그룹별로 정렬하고 다른 열을 무시하는 데 실패합니다. 이유는 무엇입니까?

이 예에서는 열 그룹별로 정렬하고 다른 열을 무시하는 데 실패합니다. 이유는 무엇입니까?

왜 작동하지 않는지 알 수 없지만 sort하지 말라고 한 열을 기준으로 정렬하고 있습니다. 우선순위에 따라 3열을 먼저 정렬한 다음 4열, 5열, 6열을 기준으로 정렬하고 싶습니다. 어떻게 되어가나요?

이것은 내 코드입니다.sort -n -s -t ',' -k3,6

이것은 내 입력입니다.

a1,b1,2,15,50,ABBA    
a1,a1,2,26,55,ABBA    
a11,2a1,2,33,55,ABBA   
b1,a1,2,80,99,ABA   
c2,a1,3,20,40,CAN   
a1,b2,3,51,300,CAN   
a3,a3,4,1000,2000,ART   
d3,c3,4,1700,2050,ART   
d3,c2c,4,1600,2050,ART   
b1,a3,4,1800,2051,ART   

이것은 내 현재 출력입니다.

a1,b1,2,15,50,ABBA   
a1,a1,2,26,55,ABBA   
a11,2a1,2,33,55,ABBA   
b1,a1,2,80,99,ABA   
c2,a1,3,20,40,CAN   
a1,b2,3,51,300,CAN   
a3,a3,4,1000,2000,ART   
d3,c3,4,1700,2050,ART 
d3,c2c,4,1600,2050,ART
b1,a3,4,1800,2051,ART   

하지만 내가 원하고 예상되는 결과는 다음과 같아야 합니다.

a1,b1,2,15,50,ABBA   
a1,a1,2,26,55,ABBA   
a11,2a1,2,33,55,ABBA   
b1,a1,2,80,99,ABA   
c2,a1,3,20,40,CAN   
a1,b2,3,51,300,CAN   
a3,a3,4,1000,2000,ART   
d3,c2c,4,1600,2050,ART    
d3,c3,4,1700,2050,ART
b1,a3,4,1800,2051,ART 

저는 리눅스를 사용하고 있습니다.

답변1

문제는 정렬 키가 쉼표를 포함하는 문자열이라는 것입니다.

4,1700,2050,ART및 와 같은 두 키를 비교할 4,1600,2050,ART동일한(로케일에서는) 키의 첫 번째 부분만 숫자 값(4 및 4)으로 변환될 수 있기 때문입니다.

이 문제를 해결하려면 각 필드를 올바른 필드 유형(숫자 또는 비숫자)과 개별적으로 비교하세요.

sort -s -t, -k3,3n -k4,4n -k5,5n -k6,6 file

대부분의 구현에서는 이러한 문제를 감지하는 데 매우 도움이 될 수 있는 옵션을 sort제공합니다 . --debug내 FreeBSD 시스템에서 이는 원래 명령에 내가 언급한 필드를 비교하는 데 문제가 있음을 분명히 보여줍니다.

$ sort --debug -n -s -t ',' -k3,6 file
[...]
; k1=<4,1000,2000,ART   >, k2=<4,1700,2050,ART   >; s1=<a3,a3,4,1000,2000,ART   >, s2=<d3,c3,4,1700,2050,ART   >; cmp1=0
; k1=<4,1700,2050,ART   >, k2=<4,1600,2050,ART   >; s1=<d3,c3,4,1700,2050,ART   >, s2=<d3,c2c,4,1600,2050,ART   >; cmp1=0
; k1=<4,1600,2050,ART   >, k2=<4,1800,2051,ART   >; s1=<d3,c2c,4,1600,2050,ART   >, s2=<b1,a3,4,1800,2051,ART   >; cmp1=0
[...]

cmp1=0k1k2비교가 동일함을 나타냅니다.

비교하려고:

$ sort --debug -s -t, -k3,3n -k4,4n -k5,5n -k6,6 file
[...]
; k1=<4>, k2=<4>; k1=<1000>, k2=<1700>; s1=<a3,a3,4,1000,2000,ART   >, s2=<d3,c3,4,1700,2050,ART   >; cmp1=-1
; k1=<4>, k2=<4>; k1=<1700>, k2=<1600>; s1=<d3,c3,4,1700,2050,ART   >, s2=<d3,c2c,4,1600,2050,ART   >; cmp1=1
; k1=<4>, k2=<4>; k1=<1000>, k2=<1600>; s1=<a3,a3,4,1000,2000,ART   >, s2=<d3,c2c,4,1600,2050,ART   >; cmp1=-1
; k1=<4>, k2=<4>; k1=<1700>, k2=<1800>; s1=<d3,c3,4,1700,2050,ART   >, s2=<b1,a3,4,1800,2051,ART   >; cmp1=-1
[...]

GNU는 sort완전히 다른 형식으로 디버그 출력을 생성할 수 있습니다.

답변2

문제는 숫자가 아닌 어휘로 정렬한다는 것입니다. -n숫자로 정렬 해야 합니다 . 그렇지 않으면 다음 보다 먼저 정렬 100됩니다 .1232

$ printf '2\n123\n100\n' | sort
100
123
2

그러나 다음과 같습니다 -n.

$ printf '2\n123\n100\n' | sort -n
2
100
123

n따라서 귀하의 경우에는 숫자로 정렬하려는 필드 에 다음을 추가해야 합니다 .

$ sort -t, -k3n,6n file  
a1,b1,2,15,50,ABBA    
a1,a1,2,26,55,ABBA    
a11,2a1,2,33,55,ABBA   
b1,a1,2,80,99,ABA   
c2,a1,3,20,40,CAN   
a1,b2,3,51,300,CAN   
a3,a3,4,1000,2000,ART   
d3,c2c,4,1600,2050,ART   
d3,c3,4,1700,2050,ART   
b1,a3,4,1800,2051,ART   

관련 정보