Linux Sort

Linux Sort

1.sort(分类)用法

sort命令选项很长,下面仅介绍各种选项。
sort命令的一般格式为:

sort -cmu -o output_file [other options] +pos1 +pos2 input_files

下面简要介绍一下sort的参数:

-c 测试文件是否已经分类。
-m 合并两个分类文件。
-u 删除所有复制行。
-o 存储s o r t结果的输出文件名。


其他选项有:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或t a b键分隔域。
-r 对分类次序或比较求逆。
+n n为域号。使用此域号开始分类。
n n为域号。在分类比较时忽略此域,一般与+n一起使用。
post1 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。

保存输出
- o选项保存分类结果,然而也可以使用重定向方法保存。下面例子保存结果到results.out:
$sort video >results.out

2.例子说明
=========================================
下面是文件video的清单,包含了上个季度家电商场的租金情况。各域为:
(1)名称,(2)供货区代码,(3)本季度租金,(4)本年租金。

域分隔符为冒号,为此对此例需使用‘-t’选项。文件如下:
[root@Linuxsvr lab]# cat video
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
Aliens :HK :532 :4892
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972

=========================================

3.启动方式
缺省情况下,sort认为“一个空格”或“一系列空格”为“分隔符”。要加入其他方式分隔,使用-t(-t+分隔符)选项,如:
[root@Linuxsvr lab]# sort -t: video
A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972

以“:”为分隔符,按照第一列排序

4.
先查看是否为域分隔设置了- t选项,如果设置了- t选项,则使用分隔符将记录分隔成 域0、域1、域2、域3等等;
如果未设置- t选项,用空格代替。
缺省时sort以每行第一个字符将整个行排序,也可以指定域号,这样就会按照指定的域优先进行排序,
如果指定的域有重复,会参考下一个域。

sort对域的参照方式:
关于sort的一个重要事实是它参照第一个域作为域0,域1是第二个域,等等。sort也可以使用整行作为分类依据。

=========================================
第一个域 第二个域第三个域 第四个域
域0 域1 域2 域3
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
Aliens :HK :532 :4892
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972

=========================================

文件是否已分类
怎样分辨文件是否已分类?如果只有30行,看看就知道了,但如果是400行呢,使用sort -c查看sort文件是否按某种顺序分类。
[root@Linuxsvr lab]# sort -c video
sort: video:2: disorder: Alien :HK :119 :1982
结果显示未分类,现在将video分类,并存为2.video
[root@Linuxsvr lab]# sort -t: video >2.video
[root@Linuxsvr lab]# sort -c 2.video
[root@Linuxsvr lab]#
没有任何错误提示,返回提示符表明已分类。然而如果测试成功,返回一个信息行会更好。

5.
基本sort

最基本的sort方式为sort filename,按第一域进行分类(分类键0)。实际上读文件时sort操作将行中各域进行比较,
这里返回基于第一域sort的结果
[root@Linuxsvr lab]# sort -t: video

A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972

sort分类求逆
如果要逆向sort结果,使用- r选项。在通读大的注册文件时,使用逆向sort很方便。下面是按域0分类的逆向结果。
[root@Linuxsvr lab]# sort -t: -r video
Toy Story :HK :239 :3972
The Hill :KL :63 :2972
Star Wars :HK :301 :4102
Boys in Company C :HK :192 :2192
Aliens :HK :532 :4892
Alien :HK :119 :1982
A Few Good Men :KL :445 :5851

按指定域分类
有时需要只按第2域(分类键1)分类。这里为重排 报文中“供应区代码”,使用t 1,意义为按分类键1分类。
下面的例子中,所有供应区代码按分类键1分类;
注意分类键2和3对应各域也被分类。因为第2域有重复,sort会再重复的情况下优先考虑下一个域的顺序。而且是按照第一个字符分类,并不是
按照整个数值大小分类63小于445,却被排到后面,因为第一个字符是6,大于4。

[root@Linuxsvr lab]# sort -t: +1 video
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
Aliens :HK :532 :4892
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972

数值域分类
依此类推,要按第三域(第二分类键)分类,使用t 2。但是因为这是数值域,即为数值分类,可以使用- n选项。下面例子为按季度租金分类命

令及结果:
[root@Linuxsvr lab]# sort -t: +2n video
The Hill :KL :63 :2972
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Aliens :HK :532 :4892
使用-n选项是按照数值大小进行排列的,不使用-n选项是按照数字位排列,先看最左边第一位大小,如果第一位相同再看第二位大小
如果不指定n,如下
[root@Linuxsvr lab]# sort -t: +2 video
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Aliens :HK :532 :4892
The Hill :KL :63 :2972

数值域倒序:
[root@Linuxsvr lab]# sort -t: +2nr video
Aliens :HK :532 :4892
A Few Good Men :KL :445 :5851
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972

唯一性分类
有时,原文件中有重复行,这时可以使用- u选项进行唯一性(不重复)分类以去除重复行,下例中A l i e n有相同的两行。带重复行的文件
如下,其中A l i e n插入了两次:
[root@Linuxsvr lab]# cat video
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63 :2972
Aliens :HK :532 :4892
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972
Aliens :HK :532 :4892

使用- u选项去除重复行,不必加其他选项, sort会自动处理。
[root@Linuxsvr lab]# sort -u video
A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972
[root@Linuxsvr lab]# sort video
A Few Good Men :KL :445 :5851
Alien :HK :119 :1982
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
The Hill :KL :63 :2972
Toy Story :HK :239 :3972

使用k的其他sort方法
sort还有另外一些方法指定分类键。可以指定k选项,第1域(分类键)以1开始。不要与前面相混淆。其他选项也可以使用k,主要用于指定分

类域开始的字符数目。格式:
-k keydef
The keydef argument is a restricted sort key field definition. The format of this definition is:

[root@Linuxsvr lab]# sort -t: -k[field_start[type][,field_end[type]]] video

[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 video
Alien :HK :119 :1982
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972

如果不指定结束域,分类将会按照后面的域以次排序。如果上面的例子不指定-k2,2后面结束域,结果如下:
[root@Linuxsvr lab]# sort -t: -k2 -k1,1 video
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
Aliens :HK :532 :4892
Aliens :HK :532 :4892
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972
上面的例子不会再以第一域排序,而是按照第二域排序,如果第二域有重复,优先考虑第三域,如果再有重复,考虑第四域,而不是第一域。


用k做分类键排序
可以指定分类键次序。再全部将结果反向排序,方法如下:
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 -r video
The Hill :KL :63 :2972
A Few Good Men :KL :445 :5851
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
Boys in Company C :HK :192 :2192
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Alien :HK :119 :1982
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 video
Alien :HK :119 :1982
Aliens :HK :532 :4892
Aliens :HK :532 :4892
Boys in Company C :HK :192 :2192
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
A Few Good Men :KL :445 :5851
The Hill :KL :63 :2972

下面的例子把Aliens改为Bliens,先对第三域反向排序,重复的地方再按照第一域正向排。
[root@Linuxsvr lab]# sort -t: +2nr -k1,1 video
Aliens :HK :532 :4892
Bliens :HK :532 :4892
A Few Good Men :KL :445 :5851
Star Wars :HK :301 :4102
Toy Story :HK :239 :3972
Boys in Company C :HK :192 :2192
Alien :HK :119 :1982
The Hill :KL :63
:2972

下面例子是先对第三域 正向排,重复的地方再按照第一域反向排
[root@Linuxsvr lab]# sort -t: +2n -k1,1 -r video
The Hill :KL :63 :2972
Alien :HK :119 :1982
Boys in Company C :HK :192 :2192
Toy Story :HK :239 :3972
Star Wars :HK :301 :4102
A Few Good Men :KL :445 :5851
Bliens :HK :532 :4892
Aliens :HK :532 :4892
//wrong
cat 1647done |awk -F"," '{ print $1" "$3" "$2}'|sort -rn |head
27 90 1281865143
27 9 1565288011
27 9 1564555610
27 9 1563708615
27 9 1563480633
27 9 1562972964
27 9 1562516991
27 9 1561724052
27 9 1548140260
27 9 1363438891
//bingo!
cat 1647done |awk -F"," '{ print $1" "$3" "$2}'|sort -rn -k1,3 -k2,2 |head
27 90 1281865143
27 89 1558144014
27 68 1558790737
27 62 1557561813
27 59 1562208594
27 57 1536871012
27 42 1547831844
27 42 1072496911
27 37 1559260203
27 37 1249959734
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值