Linux命令详解-Sort

时间:2021-10-28 09:20:08

Linux命令详解-Sort

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

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


 

sort的wiki见这里: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.txt1, Justin Timberlake, Title 545, Price $7.302, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.904, Lady Gaga, Title 118, Price $7.305, Johnny Cash, Title 482, Price $6.506, Elvis Presley, Title 335, Price $7.307, John Lennon, Title 271, Price $7.908, Michael Jackson, Title 373, Price $5.50

默认按照字母升序排列

>>sort corpus.txt1, Justin Timberlake, Title 545, Price $7.302, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.904, Lady Gaga, Title 118, Price $7.305, Johnny Cash, Title 482, Price $6.506, Elvis Presley, Title 335, Price $7.307, John Lennon, Title 271, Price $7.908, Michael Jackson, Title 373, Price $5.50

-r参数调整顺序

>>sort -r corpus.txt8, Michael Jackson, Title 373, Price $5.507, John Lennon, Title 271, Price $7.906, Elvis Presley, Title 335, Price $7.305, Johnny Cash, Title 482, Price $6.504, Lady Gaga, Title 118, Price $7.303, Mick Jagger, Title 610, Price $7.902, Taylor Swift, Title 723, Price $7.901, Justin Timberlake, Title 545, Price $7.30

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

>>sort -r  -k 2 corpus.txt2, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.908, Michael Jackson, Title 373, Price $5.504, Lady Gaga, Title 118, Price $7.301, Justin Timberlake, Title 545, Price $7.305, Johnny Cash, Title 482, Price $6.507, John Lennon, Title 271, Price $7.906, Elvis Presley, Title 335, Price $7.30

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

>>sort -t, -k4 corpus.txt8, Michael Jackson, Title 373, Price $5.505, Johnny Cash, Title 482, Price $6.501, Justin Timberlake, Title 545, Price $7.304, Lady Gaga, Title 118, Price $7.306, Elvis Presley, Title 335, Price $7.302, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.907, John Lennon, Title 271, Price $7.90

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

>>sort -t, -k4 -k3 corpus.txt8, Michael Jackson, Title 373, Price $5.505, Johnny Cash, Title 482, Price $6.504, Lady Gaga, Title 118, Price $7.306, Elvis Presley, Title 335, Price $7.301, Justin Timberlake, Title 545, Price $7.307, John Lennon, Title 271, Price $7.903, Mick Jagger, Title 610, Price $7.902, Taylor Swift, Title 723, Price $7.90

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

>>sort -t, -k4 -k2.3 corpus.txt8, Michael Jackson, Title 373, Price $5.505, Johnny Cash, Title 482, Price $6.504, Lady Gaga, Title 118, Price $7.306, Elvis Presley, Title 335, Price $7.301, Justin Timberlake, Title 545, Price $7.302, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.907, John Lennon, Title 271, Price $7.90 

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

 

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

>>sort -rt, -k4 -k3 corpus.txt2, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.907, John Lennon, Title 271, Price $7.901, Justin Timberlake, Title 545, Price $7.306, Elvis Presley, Title 335, Price $7.304, Lady Gaga, Title 118, Price $7.305, Johnny Cash, Title 482, Price $6.508, Michael Jackson, Title 373, Price $5.50

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

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

>>sort -t, -k4 -k3r corpus.txt8, Michael Jackson, Title 373, Price $5.505, Johnny Cash, Title 482, Price $6.501, Justin Timberlake, Title 545, Price $7.306, Elvis Presley, Title 335, Price $7.304, Lady Gaga, Title 118, Price $7.302, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.907, John Lennon, Title 271, Price $7.90

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

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


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

>>sort -n -k5 corpus.txt4, Lady Gaga, Title 118, Price $7.307, John Lennon, Title 271, Price $7.906, Elvis Presley, Title 335, Price $7.308, Michael Jackson, Title 373, Price $5.505, Johnny Cash, Title 482, Price $6.501, Justin Timberlake, Title 545, Price $7.303, Mick Jagger, Title 610, Price $7.902, Taylor Swift, Title 723, Price $7.90

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

>>sort -R corpus.txt 8, Michael Jackson, Title 373, Price $5.507, John Lennon, Title 271, Price $7.904, Lady Gaga, Title 118, Price $7.302, Taylor Swift, Title 723, Price $7.901, Justin Timberlake, Title 545, Price $7.303, Mick Jagger, Title 610, Price $7.905, Johnny Cash, Title 482, Price $6.506, 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文件作为示例,方便命令前后的对比。