除了提到-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)开头的行移到结尾,但在数字之前。
而INF 移动到最后一位,因为it means
infinity。
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
如果要编写可移植脚本,您可能希望在使用sort 时指定locale。