[SHELL]:sort 命令详解

转载 2011年09月24日 00:54:20
 
1.sort(分类)用法 sort命令选项很长,下面仅介绍各种选项。 sort命令的一般格式为: sort -cmu -o output_file [other options] +pos1 +pos2 input_files 下面简要介绍一下sort的参数: -c 测试文件是否已经分类。 -m 合并两个分类文件。 -u 删除所有复制行
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一起使用。
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 -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: +2 -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 -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: +2 -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: +2 -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: +2 -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

算法导论------ShellSort希尔排序

目录 1.Shellsort的思想 2.代码实现 3.增量序列 4.算法分析 5.参考资料   Shellsort是最古老的排序算法之一,该算法以其发明者Donald L. Shell的名字命名(19...
  • so_geili
  • so_geili
  • 2016-11-25 18:29:22
  • 1593

shell sort

简单记录sort的一些常用方法 中文版的帮助文档 sort -b, --ignore-leading-blanks 忽略前导的空白区域 -d, --dictionary-order 只...
  • u010267308
  • u010267308
  • 2015-11-20 15:29:59
  • 220

希尔排序 ShellSort

import java.math.* ; import java.util.* ; /** * 希尔排序 */ public class Test{ public static void ma...
  • tan_1208815066
  • tan_1208815066
  • 2015-07-29 23:15:33
  • 240

PHP排序算法系列:希尔排序

希尔排序希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。原理先将整个待排元素序列分割成若干个子序列(由相隔某个“...
  • qq_32300363
  • qq_32300363
  • 2017-04-18 16:32:08
  • 713

day18之用shell脚本实现一个希尔排序

#!/bin/bashfunction ShellSort() { echo "输入数组的长度" read size for((i=0; i
  • hj605635529
  • hj605635529
  • 2017-07-31 13:01:27
  • 127

Linux Shell sort排序常用命令

1 sort的工作原理   sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。 [rocrocket@rocr...
  • u011613729
  • u011613729
  • 2013-08-20 10:18:09
  • 27688

sorting - shell sort

#include "stdio.h" #include "string.h"#define MAX_LIST 50 typedef struct _SqList { int data[MAX_...
  • techx
  • techx
  • 2015-03-24 02:52:10
  • 345

经典排序之希尔排序

希尔排序 基本思想: 将待排序的序列分为若干组,在每组内进行直接插入排序,以使整个序列基本有序,然后再对整个序列进行直接插入排序。 该方法实质上是一种分组插入方法。 具体来说,先取一个小于n的整数d1...
  • Jaster_wisdom
  • Jaster_wisdom
  • 2016-05-24 18:22:38
  • 1244

希尔排序(ShellSort程序完整版)

#include #include void ShellSort(int *data,int left,int right) { int len = right - left + 1; ...
  • m_hahahaha1994
  • m_hahahaha1994
  • 2016-06-30 17:36:31
  • 447
收藏助手
不良信息举报
您举报文章:[SHELL]:sort 命令详解
举报原因:
原因补充:

(最多只允许输入30个字)