在bash中对具有多个小数的数字进行排序

14
在bash中,使用带有-n选项的sort命令并不能给我期望的结果。
$ cat numbers | sort -n
1.0
1.1
1.11.4
1.15
1.3
1.3.3
1.4-p1
1.6.1
2.2.10
2.2.2
2.4
2.4.6

我尝试使用-k1-k1.1n等(对于以数字1开头的数字,-k1.3n仅会得到正确排序)。看来我在这里缺少了一些非常基本的东西...

4个回答

25

有一个专门用于版本号的特殊标志-V

$ sort -V numbers

1.0
1.1
1.3
1.3.3
1.4-p1
1.6.1
1.11.4
1.15
2.2.2
2.2.10
2.4
2.4.6

注:此选项适用于GNU Coreutils,可能在其他实现中缺失。


2
在OSX上,这不是一个有效的选项。 - Joao Morais
3
稍微有趣的一点是:OS X自带的sort实际上就是 GNU sort,但它非常老旧,不支持-V;截至OS X 10.11,版本号为sort (GNU coreutils) 5.93 - mklement0
2
@mklement0:看起来他们在 macOS sort --version 2.3-Apple (99) 中添加了 -V - l'L'l

11
sort -g numbers

可以这样处理。根据sort命令的手册页面,-g是用于数字排序的:

-g, --general-numeric-sort

按一般数值顺序比较


9
你需要使用-t标志来指定“.”作为你的分隔符,并且多个键位置指示符处理逐渐变长/更深的数字。我仍然不太明白它的工作原理,但它能够正常工作...
 sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n numbers

或者

 cat numbers | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n

1

尝试一下;

sort -g -k1 file

它一定会有效的!!!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接