숫자순으로 정렬

숫자순으로 정렬

라는 파일이 있는데 data그 내용은 다음과 같습니다.

id,col1,col2
0,-0.3479417882673812,0.5664382596767175
1,-0.26800930980980764,0.2952025161991604
2,-0.4159790791116641,-1.3375045524610152
3,-0.7859665489205871,-0.6428101880909471
4,-1.3922759043388822,-1.676262144826317
5,-1.2471867496427498,-0.4912119581361516
6,1.443385383041667,1.6974039491263593
7,-2.058899802821969,2.0607628464079917
8,-0.10641338441541626,0.035929568275064216
9,-0.517273684861199,-0.6184800988804992
10,-0.9934859021679552,1.0577312348984502
11,0.5923834706792905,-0.6693757541250825
12,0.8657741917554445,-0.6876271057571398
13,-1.2061097548360489,-0.7402582563022937
14,0.78768021182158,-0.38607117005262315

-n첫 번째 열( )을 숫자순으로 정렬하면 다음과 같습니다.

$ sort -nk1 -t"," data
0,-0.3479417882673812,0.5664382596767175
id,col1,col2
1,-0.26800930980980764,0.2952025161991604
2,-0.4159790791116641,-1.3375045524610152
3,-0.7859665489205871,-0.6428101880909471
4,-1.3922759043388822,-1.676262144826317
5,-1.2471867496427498,-0.4912119581361516
7,-2.058899802821969,2.0607628464079917
8,-0.10641338441541626,0.035929568275064216
9,-0.517273684861199,-0.6184800988804992
10,-0.9934859021679552,1.0577312348984502
13,-1.2061097548360489,-0.7402582563022937
6,1.443385383041667,1.6974039491263593
11,0.5923834706792905,-0.6693757541250825
12,0.8657741917554445,-0.6876271057571398
14,0.78768021182158,-0.38607117005262315

이것은 나에게 확실히 이상합니다. 매뉴얼 페이지에서 -n숫자로 정렬해야 한다고 읽었습니다. 왜 id숫자 사이에 넣나요? 어떻게 그것이 그들 모두보다 10크 거나 작을 수 있으며 , 동시에 그들보다 클 수 있습니까?9611

-g내가 원하는 방식으로 작동하는 것 같지만 (그리고 그것이 당연하다고 생각합니다), 이 -n옵션은 나에게 전혀 적합하지 않습니다. 이것은 무엇에 관한 것입니까? 로케일과 관련이 있을 수 있다고 생각했지만 구분 기호를 로 지정하면 ,설명이 되지 않는 것 같습니다.

답변1

긴 이야기 짧게

전체 행을 사용 sort -nk1,1 -t,하거나 정렬합니다. 여기서 숫자는 천 단위 구분 기호로 해석되므로 삭제됩니다.-k1,

세부 사항

영어 로캘에서 ,이는 천 단위 구분 기호이며 sort숫자의 정수 부분을 무시합니다.

즉, 영어 로케일 또는 ,천 단위 구분 기호가 있는 모든 로케일( 의 출력 참조 locale thousands_sep) 에서 sort -nsees 를 사용 하면 무시된 일부 쓰레기가 뒤에 오는 숫자가 11,000,000표시되지 않고 11대신 11000000숫자가 표시됩니다. 또한 11,0하지만 .11110

이제(그리고 이것은 많은 사람들이 가지고 있는 문제입니다) -k1키 정의는 첫 번째 필드에서 시작하지만 중지 위치를 지정하지 않았기 때문에 줄 끝에서 끝나므로 정렬 키는 전체입니다. 행(기본값)입니다.

그래서 sort -nk1 -t,정확히 동일합니다 sort -n.

천 단위 구분 기호를 무시하고 ,입력하면 sort실제로 다음 숫자가 정렬됩니다.

0
1
2
3
4
5
61.4433853830416671
7
8
9
10
110.5923834706792905
120.8657741917554445
13
140.78768021182158

6그러니까 vs 10vs가 아니라 vs vs 입니다 11.61.443385383041667110110.5923834706792905

원하는 곳은 다음과 같습니다.

sort -nk1,1 -t,

첫 번째 구분된 필드만 정렬됩니다 ,. -k1,1첫 번째 필드의 시작 부분에서 시작하고 첫 번째 필드의 끝에서 끝나는 정렬 키를 정의합니다.

소수점이나 천 단위 구분 기호(및 소수점도)가 sort -n없는 C 로케일에서 사용할 수도 있습니다 .,.

LC_ALL=C sort -n

sort -gsort다음을 사용하기 때문에 다르게 작동합니다.strtold()키를 숫자로 해석하고 strtold()천 단위 구분 기호를 인식하지 않습니다.

id머리글 행에 관한 한 숫자 비교에서는 이는 거기에 숫자가 표시되지 않는 id...것으로 해석됩니다 . 두 개의 레코드가 동일하게 정렬될 때 수행되므로 0다음으로 시작하는 줄부터 정렬합니다 ( 여기서는 숫자 비교).0-nsort최후의 수단 비교이것은어휘전체 행 비교(및 0이전 정렬 i)

일부 sort구현을 통해최후의 수단 비교를 통해 비활성화할 수 있습니다 -s. 이렇게 하면 행이 맨 앞에 놓이게 LC_ALL=C sort -sn되지만 id이는 입력에 음수 키가 없기 때문입니다( id(다시 숫자로 0)는 여전히 맨 뒤에 정렬됩니다 -1). 정렬에서 첫 번째 행을 제외하려면 다음을 수행하십시오.

(head -n1; LC_ALL=C sort -n) < file

관련 정보