linux/shell sort命令

sort是在Linux里常用的一个命令,用来排序的

# man sort

 

1 sort的工作原理

 

sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

[rocrocket@rocrocket programming]$ cat seq.txt
banana
apple
pear
orange
[rocrocket@rocrocket programming]$ sort seq.txt
apple
banana
orange
pear

2 sort的-u选项

它的作用很简单,就是在输出行中去除重复行

[rocrocket@rocrocket programming]$ cat seq.txt
banana
apple
pear
orange
pear
[rocrocket@rocrocket programming]$ sort seq.txt
apple
banana
orange
pear
pear
[rocrocket@rocrocket programming]$ sort -u seq.txt
apple
banana
orange
pear

pear由于重复被-u选项无情的删除了。

3 sort的-r选项

sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。

[rocrocket@rocrocket programming]$ cat number.txt
1
3
5
2
4
[rocrocket@rocrocket programming]$ sort number.txt
1
2
3
4
5
[rocrocket@rocrocket programming]$ sort -r number.txt
5
4
3
2
1

4 sort的-o选项

由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile。

但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。

[rocrocket@rocrocket programming]$ sort -r number.txt > number.txt
[rocrocket@rocrocket programming]$ cat number.txt
[rocrocket@rocrocket programming]$
看,竟然将number清空了。

就在这个时候,-o选项出现了,它成功的解决了这个问题,让你放心的将结果写入原文件。这或许也是-o比重定向的唯一优势所在。

[rocrocket@rocrocket programming]$ cat number.txt
1
3
5
2
4
[rocrocket@rocrocket programming]$ sort -r number.txt -o number.txt
[rocrocket@rocrocket programming]$ cat number.txt
5
4
3
2
1

5 sort的-n选项

你有没有遇到过10比2小的情况。我反正遇到过。出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就 将10放在2前面喽。这也是sort的一贯作风。

我们如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!

[rocrocket@rocrocket programming]$ cat number.txt
1
10
19
11
2
5
[rocrocket@rocrocket programming]$ sort number.txt
1
10
11
19
2
5
[rocrocket@rocrocket programming]$ sort -n number.txt
1
2
5
10
11
19

6 sort的-t选项和-k选项

如果有一个文件的内容是这样:

[rocrocket@rocrocket programming]$ cat facebook.txt
banana:30:5.5
apple:10:2.5
pear:90:2.3
orange:20:3.4

这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。

那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实现?

幸好,sort提供了-t选项,后面可以设定间隔符。(是不是想起了cut和paste的-d选项,共鸣~~)

指定了间隔符之后,就可以用-k来指定列数了。

[rocrocket@rocrocket programming]$ sort -n -k 2 -t : facebook.txt
apple:10:2.5
orange:20:3.4
banana:30:5.5
pear:90:2.3

我们使用冒号作为间隔符,并针对第二列来进行数值升序排序,结果很令人满意。

7 其他的sort常用选项

-f  会将小写字母都转换为大写字母来进行比较,亦即忽略大小写

-c  会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

-C  会检查文件是否已排好序,如果乱序,不输出内容,仅返回1

-M  会以月份来排序,比如JAN小于FEB等等

-b  会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。

 

sort 排序

sort   -k2,2nr # 对 第二列 数值 降序排序;


当对不同的列进行不同的排序方式的时候,需要用k来指定起始列和终止列

-k1,1 表示对第一列进行字符串比较  1,1 表示起始列为第一列,终止列也为第一列
-k2,2n 表示仅对第二列进行数值比较

 

 

sort -k1,1 -k2,2n #先对第一列以字符串排序,并且,再对第二列以数值排序;

#############################################3

LANG=C sort

# 特别注意,要手工检查排序的结果,比如以下这样的数据如果用sort来做,排序结果不对:


1_159849533_159876791_minus
1_159857504_159876791_minus
1_159863063_159867704_minus
1_159863063_159876791_minus
1_159876394_159876791_minus
1_1600087_1620039_minus
1_1600087_1626312_minus
1_1600087_1663793_minus
1_160330_175755_minus
11_603753_604571_minus
11_61041769_61042463_plus
11_61041769_61080803_plus
11_61041769_61109204_plus
1_1611009_1620039_minus
1_16149007_16178803_plus
1_161514723_161524503_plus
1_161514723_161534950_plus
1_161611162_161612268_plus

As you can see, the Linux 'sort' ignores blanks, underscores, and
case while doing its thing, although these items are in the final output.
Also, each lower case letter lead character follows immediately after its
upper case brother, unlike the usual collating order where all uppercases,
together, precede the lower cases, as in the UNIX list above.
Also, the at-siogn, @, in the Linux sort comes between the exclamation and the
pound, but in UNIX, it is between the numerics and uppercase alphas.

We have tried to find what collating sequence file, LC_COLLATE, but cannot
make sense out of these data files and their associated directories in
/usr/share/locale/...

#############################################

REF

http://roclinux.cn/?p=1350

 

bugs of Sort:

https://lists.gnu.org/archive/html/bug-textutils/2000-10/msg00020.html

https://stackoverflow.com/questions/5868465/unusual-behaviour-of-linuxs-sort-command

https://unix.stackexchange.com/questions/29681/issues-of-using-sort-and-comm

https://unix.stackexchange.com/questions/224164/sort-command-inconsistent-behavior

posted @ 2014-04-11 07:28  emanlee  阅读(2468)  评论(0编辑  收藏  举报