我有一个名为的文件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
完全让我无法理解。这是怎么回事?我认为它可能与语言环境有关,但是一旦我将分隔符指定为 is ,
,我认为这不会解释它。
TL;博士
使用
sort -nk1,1 -t,
或以其他方式-k1
对整行进行排序,其中,
数字被丢弃,因为它被解释为千位分隔符。细节
在英语语言环境中,
,
是千位分隔符,它sort
忽略了数字的整数部分。换句话说,在英语语言环境中,或任何
,
有千位分隔符的语言环境中(参见 的输出locale thousands_sep
),当sort -n
看到11,000,000
它时,它不会看到11
数字后面跟着一些被忽略的垃圾,而是11000000
数字。同样11,0
is not11
but110
。现在(这是很多人的绊脚石),
-k1
定义了一个从第一个字段开始的键,但由于您没有指定它在哪里停止,在行尾结束,所以排序键是整行,它是默认值。所以
sort -nk1 -t,
是完全一样的sort -n
。,
忽略千位分隔符,您的输入sort
实际上是对这些数字进行排序:所以不是
6
vs10
vs11
,而是61.4433853830416671
vs10
vs110.5923834706792905
。在这里,你想要:
仅对第一个
,
分隔字段进行排序。-k1,1
定义一个排序键,从第一个字段的开头开始,到第一个字段的结尾结束。您也可以
sort -n
在 C 语言环境中使用,其中,
既不是十进制基数也不是千位分隔符(并且.
是十进制基数):sort -g
工作方式不同,因为sort
then 用于strtold()
将键解释为数字并且strtold()
不识别千位分隔符。就
id
标题行而言,在数字比较中,这id...
被解释为0
那里没有数字。它在开头的行之后排序,0
因为当两个记录排序相同时(这里-n
是数字比较)sort
,最后的比较是对整行的词法0
比较(并且在之前排序i
)。在某些
sort
实现中,最后的比较可以用-s
. 这里LC_ALL=C sort -sn
将把该id
行放在第一位,但这只是因为输入中没有否定键(id
(数字再次为 0)仍然会排在 之后-1
)。如果要从排序中排除第一行,可以执行以下操作: