Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 什么';gnu排序中--general numeric sort和--numeric sort选项的区别是什么_Unix_Sorting - Fatal编程技术网

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