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


1 sort的工作原理


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


功能说明:将文本文件内容加以排序,sort可针对文本文件的内容,以行为单位来排序。

语  法:sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]

参  数:

 -b   忽略每行前面开始出的空格字符。

 -c   检查文件是否已经按照顺序排序。

 -d   排序时,处理英文字母、数字及空格字符外,忽略其他的字符。

 -f   排序时,将小写字母视为大写字母。

 -i   排序时,除了040至176之间的ASCII字符外,忽略其他的字符。

 -m   将几个排序好的文件进行合并。

 -M   将前面3个字母依照月份的缩写进行排序。

 -n   依照数值的大小排序。

 -o<输出文件>   将排序后的结果存入指定的文件。

 -r   以相反的顺序来排序。

 -t<分隔字符>   指定排序时所用的栏位分隔字符。

 +<起始栏位>-<结束栏位>   以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。

 --help   显示帮助。

 --version   显示版本信息。 

sort的-u选项

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





wKiom1hIHqnx6xq1AAAf8rq1EVg756.png-wh_50



例:用sort进行排序


排序 sort seq.txt


spacer.gifwKioL1hIHsTBSMiMAAAhDBgrwlA138.png-wh_50




2.-u的参数,去除排序中的重复行


sort -u seq.txt(把derteet的一行给删除了)


wKiom1hIHuXSIp9uAAAiGdLnjPI156.png-wh_50

spacer.gif


3.-r参数,sort默认的排序方法是升序,-r就是降序排列


sort -r seq.txt


spacer.gifwKioL1hIHw6D8kSAAAAj2U5znwI110.png-wh_50




3.-o参数就是把结果输出到标准输出,需要重定向才能将结果写入原文件


但是把排序结果输出到原文件中,用重定向就会问题


例:新建一个number.txt的文件,然后用降序的方式排序把结果重定向到原文件中会把源文件给清空


vim number.txt


spacer.gifwKioL1hIHzHAdlrtAAANTD3OPes787.png-wh_50



使用-o参数后降序排列然后重定向到原文件然后查看文档会发现数字按降序排列了


sort -r number.txt -o number.txt


wKiom1hIH1OTS7ILAAAToMRHRAY520.png-wh_50

spacer.gif

4.-n 默认情况下数字排序是把数字当成字符来进行比较,排序过程中1和2相比会发现1比2小,即使是10的排序也会比2来的小,加入-n的参数就是按数值的大小来进行排序


加入-n参数进行数值排序


sort -n number.txt


spacer.gifwKioL1hIH5nh5HRiAAAPV3LAIOQ771.png-wh_50




5。-t参数表示间隔符,和cut中的-d用法一样

        -k参数可以指定列数


例:新建一个文件有3列,第一列是水果的类型,第二列是水果的数量,第三列是水果的价格,如果以水果的数量来进行排列应该如何做


新建文件


vim fruit.txt


spacer.gifwKiom1hIH7GQsmd3AAAm-96u8dM935.png-wh_50



按第二列进行排序(涉及到数值的必须要用-n参数)


sort -t: -n -k 2 fruit.txt


spacer.gifwKiom1hIH8KQ2E0xAAAQ1_MqucY947.png-wh_50



按第三列进行排序


sort -t: -n -k 3 fruit.txt


spacer.gifwKioL1hIH86DU4COAAASBl-rzyk089.png-wh_50





6.其他参数



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


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


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


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


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





关于-K参数的更多实例


准备company.txt文档,第一列是公司名称,第二列是员工人数,第三列是成立时间,第四年是工人平均工资,内容如下


vim company.txt


sina 7892 1922 7800

sohu 5677 1922 8200

baidu 12078 1956 8500

google 23444 1807 8500

facebook 5677 2001 9322

sun 2774 1942 11000





例1:以员工人数进行排列


进行排列,Facebook与sohu员工一样,f排在s前面所有Facebook就排在sohu前面


spacer.gifwKioL1hIH_ugIP9mAAAcxsNU27E513.png-wh_50





例2.以员工工资进行排列



spacer.gifwKiom1hIIBPQepuSAAAcJ_W3ZaE943.png-wh_50



例3:按公司成立时间来排序,如果有相同的成立时间,以员工工资进行排列


sort -n -t' ' -k 3 -k 4 compan.txt


spacer.gifwKioL1hIIC7z6kAiAAAbYkkDOgQ855.png-wh_50




例4:成立时间按降序排列,如果成立时间相同,则按员工工资升序排列


sort -n -t' ' -k 3r -k 4 company.txt


wKiom1hIIHejTzyuAAAcaM17WnE099.png-wh_50


spacer.gif

例5:把员工人数中重复的给去掉


sort -n -u -k 2 company.txt


wKiom1hIIJHSso1RAAAZXG0x0Ek007.png-wh_50

spacer.gif