gnu sort中--general-numeric-sort和--nummeric-sort选项之间的区别是什么

时间:2009-08-10 16:10:25

标签: unix sorting

sort提供两种数字排序。这是来自手册页:

   -g, --general-numeric-sort
          compare according to general numerical value

   -n, --numeric-sort
          compare according to string numerical value

有什么区别?

3 个答案:

答案 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(例如Nananani lol)或-INF(单破折号,而不是--INF)开头,但移至结尾数字。 由于it means infinityINF移至最后一位数字。

  • NANINF-INF 不区分大小写

  • 始终忽略NANINF-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