shell命令之sort

来源:互联网 发布:安知玉如意 编辑:程序博客网 时间:2024/06/14 20:16

本文主要源自Linux Shell sort排序常用命令
sort命令按行,依据字典顺序进行升序排序。
对于文件file.txt:

bananaapplepearorangepear

最简单的就是直接排序,即

sort file.txt输出:applebananaorangepearpear

使用-r降序,即

sort -r file.txt输出:pearpearorangebananaapple

使用-u去掉重复行,即

sort -u file.txt输出:applebananaorangepear

sort默认输出到标准输出,借助重定向可以输出到文件,但是sort file.txt > file.txt 会使得file.txt为空,这里可以借助-o选项,即

sort  file.txt -o file.txt输出:applebananaorangepearpear

sort默认按照字符排序,即便是数值文件,也会是字符字典排序,这时候当排序可以使用-n。
对于文件num.txt:

110191125

常规排序:

sort num.txt输出:110111925

按数字排序:

sort -n num.txt输出:125101119

下面是-t和-k选项,现有文件com.txt:

google 110 5000baidu 100 5000guge 50 3000sohu 100 4500

分别是公司名,人数和平均工资。-t是分隔符,-k是第几个域。
1、按照公司人数排序

sort -n -t ' ' -k 2 com.txt输出:guge 50 3000baidu 100 5000sohu 100 4500google 110 5000

当公司人数都是100时,又按照baidu排在sohu前当顺序排列。

2、按照公司人数排序 ,人数相同的按照员工平均工资升序排序

sort -n -t ' ' -k 2 -k 3 com.txt输出:guge 50 3000sohu 100 4500baidu 100 5000google 110 5000

上述先按照第二个字段排序,然后按照第三个字段排序
3、按照员工工资降序排序,如果员工人数相同的,则按照公司人数升序排序

sort -n -t ' ' -k 3r -k 2 com.txt输出:baidu 100 5000google 110 5000sohu 100 4500guge 50 3000

继续-k的用法,[ FStart [ .CStart ] ] [ Modifier ] [ , [ FEnd [ .CEnd ] ][ Modifier ] ],即[开始域[.开始域的开始位置][命令]][,结束域[.结束域的结束位置]]。还是举例比较清楚。这个Modifier就类似与上面的sort -n -t ' ' -k 3r -k 2 com.txt的r。
4、从公司英文名称的第二个字母开始进行排序

sort -t ' ' -k 1.2 com.txt输出:baidu 100 5000sohu 100 4500google 110 5000guge 50 3000

上面表示从第一个域的第二个字符开始排序,所以ohu比oog靠前。
5、只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序

sort -t ' ' -k 1.2,1.2 -k 3nr com.txt输出:baidu 100 5000google 110 5000sohu 100 4500guge 50 3000

当-u和-k同时使用时,-u关注的是-k的那个字段。

sort -n -k 2 -u com.txt输出:guge 50 3000baidu 100 5000google 110 5000

由于sohu也是100员工,所以被干掉了。同理,下面的例子输出为:

sort  -k 1.1,1.1 -u com.txtbaidu 100 5000google 110 5000sohu 100 4500

6、最诡异的排序:

sort -n -k 2.2,3.1 com.txtguge 50 3000baidu 100 5000sohu 100 4500google 110 5000

以第二个域的第二个字符开始到第三个域的第一个字符结束的部分进行排序。

第一行,会提取0 3,第二行提取00 5,第三行提取00 4,第四行提取10 5。又因为sort认为0小于00小于000小于0000….因此0 3肯定是在第一个。10 5肯定是在最后一个。但为什么00 5却在00 4前面呢?因为sort只会比较第二个域的第二个字符到第二个域的最后一个字符的部分,而不会把第三个域的开头字符纳入比较范围。

原创粉丝点击