라는 파일이 있는데 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
크 거나 작을 수 있으며 , 동시에 그들보다 클 수 있습니까?9
6
11
-g
내가 원하는 방식으로 작동하는 것 같지만 (그리고 그것이 당연하다고 생각합니다), 이 -n
옵션은 나에게 전혀 적합하지 않습니다. 이것은 무엇에 관한 것입니까? 로케일과 관련이 있을 수 있다고 생각했지만 구분 기호를 로 지정하면 ,
설명이 되지 않는 것 같습니다.
답변1
긴 이야기 짧게
전체 행을 사용 sort -nk1,1 -t,
하거나 정렬합니다. 여기서 숫자는 천 단위 구분 기호로 해석되므로 삭제됩니다.-k1
,
세부 사항
영어 로캘에서 ,
이는 천 단위 구분 기호이며 sort
숫자의 정수 부분을 무시합니다.
즉, 영어 로케일 또는 ,
천 단위 구분 기호가 있는 모든 로케일( 의 출력 참조 locale thousands_sep
) 에서 sort -n
sees 를 사용 하면 무시된 일부 쓰레기가 뒤에 오는 숫자가 11,000,000
표시되지 않고 11
대신 11000000
숫자가 표시됩니다. 또한 11,0
하지만 .11
110
이제(그리고 이것은 많은 사람들이 가지고 있는 문제입니다) -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 10
vs가 아니라 vs vs 입니다 11
.61.4433853830416671
10
110.5923834706792905
원하는 곳은 다음과 같습니다.
sort -nk1,1 -t,
첫 번째 구분된 필드만 정렬됩니다 ,
. -k1,1
첫 번째 필드의 시작 부분에서 시작하고 첫 번째 필드의 끝에서 끝나는 정렬 키를 정의합니다.
소수점이나 천 단위 구분 기호(및 소수점도)가 sort -n
없는 C 로케일에서 사용할 수도 있습니다 .,
.
LC_ALL=C sort -n
sort -g
sort
다음을 사용하기 때문에 다르게 작동합니다.strtold()
키를 숫자로 해석하고 strtold()
천 단위 구분 기호를 인식하지 않습니다.
id
머리글 행에 관한 한 숫자 비교에서는 이는 거기에 숫자가 표시되지 않는 id...
것으로 해석됩니다 . 두 개의 레코드가 동일하게 정렬될 때 수행되므로 0
다음으로 시작하는 줄부터 정렬합니다 ( 여기서는 숫자 비교).0
-n
sort
최후의 수단 비교이것은어휘전체 행 비교(및 0
이전 정렬 i
)
일부 sort
구현을 통해최후의 수단 비교를 통해 비활성화할 수 있습니다 -s
. 이렇게 하면 행이 맨 앞에 놓이게 LC_ALL=C sort -sn
되지만 id
이는 입력에 음수 키가 없기 때문입니다( id
(다시 숫자로 0)는 여전히 맨 뒤에 정렬됩니다 -1
). 정렬에서 첫 번째 행을 제외하려면 다음을 수행하십시오.
(head -n1; LC_ALL=C sort -n) < file