“排序-n”和“排序-g”有什么区别?

“排序-n”和“排序-g”有什么区别?

两个排序选项-n和之间有什么区别-g

细节太多但文档不够充分,这有点令人困惑。

答案1

长话短说

虽然-n会对简单的浮点数进行排序,例如1.234,但该-g选项可以处理更广泛的数字格式,但速度较慢。

也是-gPOSIX 规范的 GNU 扩展。


man sort,相关部分是:

     -g, --general-numeric-sort, --sort=general-numeric
             Sort by general numerical value.  As opposed to -n, this option
             handles general floating points.  It has a more permissive format
             than that allowed by -n but it has a significant performance
             drawback.

...

     -n, --numeric-sort, --sort=numeric
             Sort fields numerically by arithmetic value.  Fields are supposed
             to have optional blanks in the beginning, an optional minus sign,
             zero or more digits (including decimal point and possible thou-
             sand separators).

...

STANDARDS
     The sort utility is compliant with the IEEE Std 1003.1-2008 (``POSIX.1'')
     specification.

     The flags [-ghRMSsTVz] are extensions to the POSIX specification.

...

NOTES

...

     When sorting by arithmetic value, using -n results in much better perfor-
     mance than -g so its use is encouraged whenever possible.

但是,完整的文档由 提供,info而不是man

7.1 sort:对文本文件进行排序,描述/区别更清晰:

‘-g’

‘--general-numeric-sort’

‘--sort=general-numeric’

按数字排序,将每行的前缀转换为长双精度浮点数。看浮点。不报告上溢、下溢或转换错误。使用以下整理顺序:

  • 不以数字开头的行(都被认为是相等的)。
  • NaN(IEEE 浮点算术中的“非数字”值)采用一致但依赖于机器的顺序。
  • 负无穷大。
  • 按升序排列的有限数(带有 -0和+0平等的)。
  • 再加上无穷大。

仅当没有其他选择时才使用此选项;它比--numeric-sort( -n) 慢得多,并且在转换为浮点数时可能会丢失信息。

您可以使用此选项对前缀为“ 0x”或“ 0X”的十六进制数字进行排序,这些数字的宽度不固定,或者大小写不同。然而,对于大小写一致的十六进制数字,并且用 ' 0' 左侧填充以达到一致的宽度,标准字典排序会更快。

...

‘-n’

‘--numeric-sort’

‘--sort=numeric’

按数字排序。该数字以每行开始,由可选的空格、可选的“ -”符号以及可能由千位分隔符分隔的零个或多个数字组成,后面可选地跟随一个小数点字符和零个或多个数字。空数被视为“ 0”。区域LC_NUMERIC设置指定小数点字符和千位分隔符。默认情况下,空白是空格或制表符,但LC_CTYPE区域设置可以更改这一点。

比较准确;没有舍入误差。

+无法识别前导 ' ' 和指数符号。要对此类字符串进行数字比较,请使用--general-numeric-sort ( -g) 选项。


快速演示:

$ printf '%s\n' 0.1 10 1e-2 | sort -n
0.1
1e-2
10

$ printf '%s\n' 0.1 10 1e-2 | sort -g
1e-2
0.1
10

相关内容