Linux命令详解-Sort

Linux命令详解-Sort

 

 

sort大家应该都用过,但是sort的真正强大之处大家有了解吗?

今天学习下sort,学习完sort之后配合上上次学习的uniq就能做很多事情了。



sortwiki见这里:http://en.wikipedia.org/wiki/Sort_(Unix)

按照惯例,我们先man一下sort的用法

 

 sort - sort lines of text files

看到了吗,介绍非常简单对文件的lines内容进行排序。介绍简单并不意味这功能简单,小介绍有大作用。


先看下sort的参数,关注主要使用的参数,有些参数的使用场景比较特殊,不做多介绍:

 

-b:进行域分割时,忽略第一个空格
-f:每行的小写字母转为大写字母进行sort
-i:忽略非打印字符,只考虑打印字符
-M:进行morth-sort:Unknown < JAN < ... < DEC
-n:按照String的numerical值进行排序
-r:默认升序排列,这个参数调整为降序排列

-kPOS1,POS2:将每行的值分割,起始于POS1,结束语POS2
-o:定义输出文件
-t:设定分隔符,和awk的-F参数一样
-u:选项进行唯一性

 

 

下面我们进行sort使用分析

文件准备,使用文件corpus.txt

 

 

>>cat corpus.txt
1, Justin Timberlake, Title 545, Price $7.30
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
4, Lady Gaga, Title 118, Price $7.30
5, Johnny Cash, Title 482, Price $6.50
6, Elvis Presley, Title 335, Price $7.30
7, John Lennon, Title 271, Price $7.90
8, Michael Jackson, Title 373, Price $5.50

 

 

默认按照字母升序排列

 

 

>>sort corpus.txt
1, Justin Timberlake, Title 545, Price $7.30
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
4, Lady Gaga, Title 118, Price $7.30
5, Johnny Cash, Title 482, Price $6.50
6, Elvis Presley, Title 335, Price $7.30
7, John Lennon, Title 271, Price $7.90
8, Michael Jackson, Title 373, Price $5.50
 

 

-r参数调整顺序

 

 

>>sort -r corpus.txt
8, Michael Jackson, Title 373, Price $5.50
7, John Lennon, Title 271, Price $7.90
6, Elvis Presley, Title 335, Price $7.30
5, Johnny Cash, Title 482, Price $6.50
4, Lady Gaga, Title 118, Price $7.30
3, Mick Jagger, Title 610, Price $7.90
2, Taylor Swift, Title 723, Price $7.90
1, Justin Timberlake, Title 545, Price $7.30
 

 

-k参数能够选择域,默认域是空格或者tab分割,选择第二个域进行降序排列,即人名那一列

 

 

>>sort -r  -k 2 corpus.txt
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
8, Michael Jackson, Title 373, Price $5.50
4, Lady Gaga, Title 118, Price $7.30
1, Justin Timberlake, Title 545, Price $7.30
5, Johnny Cash, Title 482, Price $6.50
7, John Lennon, Title 271, Price $7.90
6, Elvis Presley, Title 335, Price $7.30
 

 

-t参数能够使用自定义的分隔符 -t=","逗号分割

 

>>sort -t, -k4 corpus.txt
8, Michael Jackson, Title 373, Price $5.50
5, Johnny Cash, Title 482, Price $6.50
1, Justin Timberlake, Title 545, Price $7.30
4, Lady Gaga, Title 118, Price $7.30
6, Elvis Presley, Title 335, Price $7.30
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
7, John Lennon, Title 271, Price $7.90

 

 

如果想同时对多列进行排序,可以使用多个-k参数

 

>>sort -t, -k4 -k3 corpus.txt
8, Michael Jackson, Title 373, Price $5.50
5, Johnny Cash, Title 482, Price $6.50
4, Lady Gaga, Title 118, Price $7.30
6, Elvis Presley, Title 335, Price $7.30
1, Justin Timberlake, Title 545, Price $7.30
7, John Lennon, Title 271, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
2, Taylor Swift, Title 723, Price $7.90
 

 

我想对某个域的第N个字符进行排序

 

 

>>sort -t, -k4 -k2.3 corpus.txt
8, Michael Jackson, Title 373, Price $5.50
5, Johnny Cash, Title 482, Price $6.50
4, Lady Gaga, Title 118, Price $7.30
6, Elvis Presley, Title 335, Price $7.30
1, Justin Timberlake, Title 545, Price $7.30
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
7, John Lennon, Title 271, Price $7.90 

3是因为名字面前有个空格 



对多个排序书序添加-r参数

 

>>sort -rt, -k4 -k3 corpus.txt
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
7, John Lennon, Title 271, Price $7.90
1, Justin Timberlake, Title 545, Price $7.30
6, Elvis Presley, Title 335, Price $7.30
4, Lady Gaga, Title 118, Price $7.30
5, Johnny Cash, Title 482, Price $6.50
8, Michael Jackson, Title 373, Price $5.50
 

 

对比上面两个输出可以看出来,添加-r参数后,这两个排序都遵从了-r的规则,即同时升序或者降序

如果我想一个域使用升序,一个域使用降序怎么办?把r参数添加到-k后面就行

 

 

>>sort -t, -k4 -k3r corpus.txt
8, Michael Jackson, Title 373, Price $5.50
5, Johnny Cash, Title 482, Price $6.50
1, Justin Timberlake, Title 545, Price $7.30
6, Elvis Presley, Title 335, Price $7.30
4, Lady Gaga, Title 118, Price $7.30
2, Taylor Swift, Title 723, Price $7.90
3, Mick Jagger, Title 610, Price $7.90
7, John Lennon, Title 271, Price $7.90

 

 

-r参数位置的不同可以控制不同的排序标准,这个一定要牢记。

注意这个-r参数直接写在sort命令上和挂载-k后面是不一样的,具体怎么的不一致各位同学可以自己验证下



-n参数能够把该域按照数字进行排序

 

>>sort -n -k5 corpus.txt
4, Lady Gaga, Title 118, Price $7.30
7, John Lennon, Title 271, Price $7.90
6, Elvis Presley, Title 335, Price $7.30
8, Michael Jackson, Title 373, Price $5.50
5, Johnny Cash, Title 482, Price $6.50
1, Justin Timberlake, Title 545, Price $7.30
3, Mick Jagger, Title 610, Price $7.90
2, Taylor Swift, Title 723, Price $7.90

 

 

最后给个sort的奇怪用法,-R=random-sort

 

 

>>sort -R corpus.txt 
8, Michael Jackson, Title 373, Price $5.50
7, John Lennon, Title 271, Price $7.90
4, Lady Gaga, Title 118, Price $7.30
2, Taylor Swift, Title 723, Price $7.90
1, Justin Timberlake, Title 545, Price $7.30
3, Mick Jagger, Title 610, Price $7.90
5, Johnny Cash, Title 482, Price $6.50
6, Elvis Presley, Title 335, Price $7.30 

多执行几次,可以发现每次执行的结果都不一样。其实可以看做是将输出结果随机化,不知道这种方法的随机效果怎么样。

注意,这个方法和平台有关,有可能你的*nix系统没有这个random-sort参数 




现在看到某些sort命令会有+1-1这些符号,这些符号是怎么回事?

这个是sort参数的古老的表示形式,现在已经在新的平台上已经不再使用,应该在某些平台上还在支持,我自己的机器就不支持这种语法。



下面我们使用sort来实践一下,做几个例子:

 

1:获得目录下文件大小的顺序

 

ls -al | sort -k5 -rn

 你可以放到任何目录下,执行以下上面这个命令看下结果


2:获得当前系统中运行的最占内存的前10个程序

 

ps aux | sort -k 6 -rn | head -n10
 

3:看看你最常使用的前十个shell命令

 

history | sort -k4 | awk '{print $4}' | uniq -c | sort -k1 -nr | head -n10

 执行以下,看看你最常用的shell命令是什么,也看下你是个什么类型的程序猿或者程序媛



有没有觉得很有意思。


上面的这些命令参数应该能帮助你完成大部分的工作内容,但是如果你不满意,还想了解sort更多的理论知识,可以看下这篇文章:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html。本文的内容和这篇文章类似,只是偏重于应用,并且只采用corpus.txt文件作为示例,方便命令前后的对比。

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自isilic.iteye.com/blog/1756631