Answers:
一般数字排序将数字作为浮点数进行比较,这可以采用科学记数法,例如1.234E10,但速度较慢并且容易出现舍入错误(1.2345678可能在1.2345679之后),数字排序只是一种常规的字母排序,知道10在9之后。
参见http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html
'-g''--general-numeric-sort''--sort = general-numeric'使用标准C函数strtod进行数字排序,将每行的前缀转换为双精度浮点数。这允许以科学计数法指定浮点数,例如1.0e-34和10e100。LC_NUMERIC语言环境确定小数点字符。不要报告上溢,下溢或转换错误。使用以下整理顺序:不以数字开头的行(均视为相等)。NaN(IEEE浮点运算中的“非数字”值)以一致但与机器相关的顺序排列。负无穷大。有限数字按升序排列(-0和+0相等)。再加上无限。
仅在没有其他选择时才使用此选项。它比--numeric-sort(-n)慢得多,并且转换为浮点数时可能会丢失信息。
'-n''--numeric-sort''--sort = numeric'按数字排序。数字以每行开头,由可选的空格,可选的“-”符号以及可能由数千个分隔符分隔的零个或多个数字组成,并可选地后面跟一个小数点字符和零个或多个数字。空数字将被视为“ 0”。LC_NUMERIC语言环境指定小数点字符和千位分隔符。默认情况下,空格是空格或制表符,但是LC_CTYPE语言环境可以更改此设置。
比较准确;没有舍入错误。
前导“ +”或指数符号均无法识别。要对这些字符串进行数字比较,请使用--general-numeric-sort(-g)选项。
-k3.2n
或者-k3.2g
,它R10
在之前进行排序R2
。排序是字典式的,不是数字式的。我希望它将第二个字符开始的字段视为一个数字。
sort
的主要规格。是真正的拜占庭式-简称:字段前面的空格被认为是字段的一部分,所以为char。索引1指向字段前面的(第一个)空白,而不是字段的实际第一个字符。后缀字符。用指数b
来解决这个问题,即:-k 3.2bn,3
(注意,全球 -b
选项确实没有在这种情况下工作)。还要注意添加的,3
,它确保仅使用第三个字段-不使用第二个字段索引,则使用整行的其余部分。
您应该注意自己的语言环境。例如,您可能打算对浮点数进行排序(例如2.2),而您的语言环境可能希望使用逗号(例如2,2)。
如本论坛所报道,使用-n或-g标志可能会导致错误的结果。
就我而言,我使用:
LC_ALL=C sort -k 6,6n file
为了对包含以下内容的第六列进行排序:
2.5
3.7
1.4
为了获得
1.4
2.5
3.7
-n
将逗号识别为千位分隔符-“ 1,000”被视为与“ 1”相同。
sort
使用最长前缀逻辑:使用了它识别为数字的行/键的最长部分;在.
用作基数字符的语言环境中,它将在处停止读取,
。
LC_ALL=C
确实是最可靠的选择;但是,如果LC_ALL
碰巧没有下注,它LANG=C
也会起作用。
LANG=C sort -k 6,6n file
简单,而且还可以将环境变量的设置本地化LANG
为特定命令。
除了提及-g
允许科学表示的可接受答案外,我还要显示最有可能导致不良行为的部分。
与-g
:
$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -g myfile
baa
--inf
--inf
--inf-
--inf--
--inf-a
--nnf
nnf--
nnn
tnan
zoo
naN
Nana
nani lol
-inf
-inf--
-11
-2
-1
1
+1
2
+2
0xa
11
+11
inf
请看zoo
这里的三件重要的事情:
行的开头是NAN
(例如Nana
和nani lol
)或-INF
(单破折号,不是--INF
)移动到结尾但在数字之前。而INF
移动到数字后的最后一位是因为这意味着无穷大。
的NAN
,INF
以及-INF
是不区分大小写。
线总是从任一侧忽略空白NAN
,INF
, -INF
(不管LC_CTYPE
)。其他字母可能会从两侧忽略空格,具体取决于语言环境LC_COLLATE
(例如,LC_COLLATE=fr_FR.UTF-8
忽略但LC_COLLATE=us_EN.UTF-8
不能忽略)。
因此,如果您要对任意字母数字进行排序,则可能不需要-g
。如果您确实需要与之进行科学的符号比较-g
,那么您可能希望提取字母和数字数据并分别进行比较。
如果您只需要普通数字(例如1, -1
)排序,并且觉得0x/E/+ sorting
不重要,则只需使用-n
足够:
$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -n myfile
-1000
-22
-13
-11
-010
-10
-5
-2
-1
-0.2
-0.12
-0.11
-0.1
0x1
0x11
0xb
+1
+11
+2
-a
-aa
--aa
-aaa
-b
baa
BAA
bbb
+ignore
inf
-inf
--inf
--inf
--inf-
--inf--
-inf--
--inf-a
naN
Nana
nani lol
--nnf
nnf--
nnn
None
uum
Zero cool
-zzz
1
1.1
1.234E10
5
11
任一-g
或者-n
,要注意的区域效应。您可能需要指定LC_NUMERIC
as us_EN.UTF-8
以避免fr_FR.UTF-8 -
浮点数排序失败:
$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=fr_FR.UTF-8 sort -n myfile
-10
-5
-2
-1
-1.1
-1.2
-0.1
-0.11
-0.12
-0.2
-a
+b
middle
-wwe
+zoo
1
1.1
与LC_NUMERIC=en_US.UTF-8
:
$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=en_US.UTF-8 sort -n myfile
-10
-5
-2
-1.2
-1.1
-1
-0.2
-0.12
-0.11
-0.1
-a
+b
middle
-wwe
+zoo
1
1.1
或LC_NUMERIC=us_EN.UTF-8
到组+|-|space
用alpha
:
$ LC_COLLATE=fr_FR.UTF-8 LC_NUMERIC=us_EN.UTF-8 sort -n myfile
-0.1
a
b
a
b
+b
+zoo
-a
-wwe
middle
1
您可能想在使用locale
时指定sort
是否要编写可移植脚本。
sort
不是man
页面而是info
页面(info sort
)。