欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux命令详解-Sort

程序员文章站 2022-04-30 23:11:55
...

 

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文件作为示例,方便命令前后的对比。

 

 

 

 

 

 

 

 

 

 

 

 

相关标签: linux