shell命令之sort

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

banana
apple
pear
orange
pear

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

sort file.txt
输出:
apple
banana
orange
pear
pear

使用-r降序,即

sort -r file.txt
输出:
pear
pear
orange
banana
apple

使用-u去掉重复行,即

sort -u file.txt
输出:
apple
banana
orange
pear

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

sort  file.txt -o file.txt
输出:
apple
banana
orange
pear
pear

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

1
10
19
11
2
5

常规排序:

sort num.txt
输出:
1
10
11
19
2
5

按数字排序:

sort -n num.txt
输出:
1
2
5
10
11
19

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

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

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

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

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

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

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

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

sort -n -t ' ' -k 3r -k 2 com.txt
输出:
baidu 100 5000
google 110 5000
sohu 100 4500
guge 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 5000
sohu 100 4500
google 110 5000
guge 50 3000

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

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

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

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

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

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

6、最诡异的排序:

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值