Unix 什么';gnu排序中--general numeric sort和--numeric sort选项的区别是什么
Unix 什么';gnu排序中--general numeric sort和--numeric sort选项的区别是什么,unix,sorting,Unix,Sorting,sort提供两种数字排序。这来自手册页: -g, --general-numeric-sort compare according to general numerical value -n, --numeric-sort compare according to string numerical value 区别是什么?通用数字排序将数字作为浮点数进行比较,这允许使用科学表示法,例如1.234E10,但速度较慢且存在舍入错误(1.2345
sort
提供两种数字排序。这来自手册页:
-g, --general-numeric-sort
compare according to general numerical value
-n, --numeric-sort
compare according to string numerical value
区别是什么?通用数字排序将数字作为浮点数进行比较,这允许使用科学表示法,例如1.234E10,但速度较慢且存在舍入错误(1.2345678可能在1.2345679之后),数字排序只是一种常规的字母排序,知道10在9之后 看 “-g”-常规数字排序” “--sort=常规数字”排序 数值上,使用标准C 函数strtod,用于转换的前缀 每一行的精度都是双精度的 浮点数。这允许 要指定的浮点数 在科学记数法中,如1.0e-34 和10e100。LC_数字区域设置 确定小数点 性格不要报告溢出, 下溢或转换错误。使用 以下排序顺序: 不以数字开头的行 (所有被认为是平等的)。南斯 (“非数字”值,在IEEE中 浮点运算)在 一致但依赖于机器 秩序。负无穷大。有限的 数字升序 (与-0和+0相等)。加上 无限 仅当不存在此选项时才使用此选项 可供替代的它比以前慢得多 --数字排序(-n),转换为时可能会丢失信息 浮点数 '-n''--数值排序'--sort=numeric' 按数字排序。号码开始了 每行和由可选的 空格、可选的“-”号和零 一个或多个可能由分隔符分隔的数字 数千个分离器(可选) 后跟小数点字符 和零个或多个数字。空的 数字被视为“0”。这个 LC\u数值区域设置指定 小数点字符和千 分离器。默认情况下,空白为空 空格或制表符,但LC_CTYPE 语言环境可以改变这一点 比较准确;没有 舍入误差 既不是前导“+”也不是指数 符号是公认的。比照 对于此类字符串,请使用 --通用数字排序(-g)选项
你应该小心你的区域设置。例如,您可能希望对浮点数(如2.2)进行排序,而您的区域设置可能希望使用逗号(如2,2) 如中所述,使用-n或-g标志可能会得到错误的结果 就我而言,我使用:
LC_ALL=C sort -k 6,6n file
为了对包含以下内容的第6列进行排序:
2.5
3.7
1.4
为了获得
1.4
2.5
3.7
除了提到
-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
看看动物园
,这里有三件重要的事情:
- 行首以
(例如NAN
和Nana
)或nani lol
(单破折号,不是-INF
)移动到末尾但在数字之前。 而-INF
移到后面的最后一位,因为INF
、NAN
和INF
不区分大小写-INF
- 行始终忽略
、NAN
、INF
两侧的空格(无论-INF
)。其他字母可以忽略任意一侧的空白,具体取决于语言环境LC\u CTYPE
(例如LC\u-COLLATE
忽略,但LC\u-COLLATE=fr\u-fr.UTF-8
不忽略)LC\u-COLLATE=us\u EN.UTF-8
-g
。如果您确实需要将科学符号与-g
进行比较,那么您可能需要提取字母表和
数值数据和分别进行比较
如果您只需要普通数字(例如,1,-1
)排序,并且觉得0x/e/+排序
不重要,只需使用-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\u NUMERIC
指定为us\u EN.UTF-8
:
使用LC\u NUMERIC=en\u 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\u NUMERIC=us\u EN.UTF-8
将+-|空格
与字母
分组:
$ 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
如果要编写可移植脚本,在使用
sort
时可能需要指定locale
。谢谢。奇怪的是,男人和信息页面中没有这个。我也不知道,这东西对我不管用。我正在对一个第三列的文件进行排序,其内容类似于R1 R2 R10 R15。使用-k3.2n
或-k3.2g
,它在R2
之前排序R10
。排序是字典式的,不是数字的。我希望它将从第二个字符开始的字段视为一个数字。@Kaz:sort
的密钥规格。都是真正的拜占庭式的——简而言之:字段前面的空格被认为是字段的一部分,所以char。索引1指向字段前面的(第一个)空白,而不是字段的实际第一个字符。给字符加后缀。用b
索引以解决此问题,即:-K3.2亿,3
(请注意,全局-b
选项在这种情况下不起作用)。还要注意添加的,3
,它确保只使用第三个字段-如果没有第二个字段索引,则使用整行的剩余部分。注意排序的完整文档不是人
页面,而是信息
页面(信息排序
)。即使使用LANG=C,我无法让-n
将逗号识别为千位分隔符-“1000”被视为与“1”相同。这应该是LC_ALL=C。@Scott:事实上,千位分隔符无法识别:sort
使用最长前缀逻辑:它识别的行/键的最长部分
$ 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