sort
提供两种数字排序。这是来自手册页:
-g, --general-numeric-sort
compare according to general numerical value
-n, --numeric-sort
compare according to string numerical value
有什么区别?
答案 0 :(得分:78)
一般数字排序将数字作为浮点数进行比较,这允许科学记数法,例如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. function strtod转换前缀 每一行都是双精度 浮点数。这允许 要指定的浮点数 用科学记数法,如1.0e-34 和10e100。 LC_NUMERIC区域设置 确定小数点 字符。不报告溢出, 下溢或转换错误。使用 以下整理顺序: 不以数字开头的行 (都被认为是平等的)。 NaN的 (IEEE中的“非数字”值 浮点运算) 一致但机器依赖 订购。减无限。有限 数字以升序排列 (-0和+0相等)。加 无穷。
仅在没有时才使用此选项 替代;它比...慢得多 --numeric-sort(-n),转换为时可能会丢失信息 浮点。
' - n'' - 数字排序'' - sort = numeric' 按数字排序。号码开始了 每一行都包含可选项 空白,可选的' - '符号,零 或更多数字可能由...分隔 数千个分隔符,可选 后跟一个小数点字符 和零个或多个数字。一个空的 数字被视为'0'。该 LC_NUMERIC语言环境指定 小数点字符和数千 分隔器。默认情况下,空白是a 空格或制表符,但LC_CTYPE locale可以改变这个。
比较准确;没有 舍入误差。
既不是领先的'+'也不是指数 符号被认可。比较 这样的字符串数字,使用 --general-numeric-sort(-g)选项。
答案 1 :(得分:10)
您应该小心使用您的语言环境。例如,您可能打算对浮点数(如2.2)进行排序,而您的语言环境可能需要使用逗号(如2,2)。
正如this forum中所报告的那样,使用-n或-g标志可能会导致错误的结果。
就我而言,我使用:
LC_ALL=C sort -k 6,6n file
为了对包含以下内容的第6列进行排序:
2.5
3.7
1.4
为了获得
1.4
2.5
3.7
答案 2 :(得分:0)
除了提到的 -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
)开头,但移至结尾数字。
由于it means
infinity,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
指定为us_EN.UTF-8
to avoid fr_FR.UTF-8 sort -
with floating number failed:
$ 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
。