sort命令
访问量:2175

一、简介

sort命令主要排序文件、对已排序的文件进行合并,并检查文件以确定它们是否已排序等。工作原理是将文件的每一行作为一个单元,每个单元可以包含多个排序关键字,默认情况下通过空格将单元分为多个排序关键字,然后逐一相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按一定顺序(默认是升序)输出。如果未指定任何文件名,那么该命令对标准输入排序。

由于sort命令很多参数都围绕着排序关键字,有必要很好理解这个排序关键字。sort命令是以行为单元,如下文件test.go:

var res []float64
var name string

包含了两个单位,默认情况下sort会以空格去分隔每个单元(当然我们可以通过参数-t去指定分隔符),所以,第一个单元包含三个排序关键字varres以及[]float64。第二个单元也包含三个排序关键字varname以及string

此时,我们可以通过-k来指定排序比较的关键字(有的地方也叫做域),如果不指定,sort 命令首先根据第一个排序关键字的内容对所有行排序。然后,根据第二个排序关键字的内容,对所有第一个排序关键字相同的行排序,如此进行下去。按照排序关键字在命令行中出现的顺序给它们编号。如果两行对所有排序关键字的排序都相同,那么对全部行依据当前语言环境的整理顺序进行比较。

针对上面的test.go只需sort test.go命令,通过比较的个关键字。第一个关键字相同,然后比较第二个关键字,由于r的ASCII码为114,n的ASCII为110,于是认为第一个单位大于第二个单元,结束排序,排序结果如下:

var name string
var res []float64

备注:sort命令在比较的时候,会忽略关键字之间的分隔符(默认的分隔符为空格)。如,将test.go文件中,添加一个或多个空格如下:

var name string
var      res []float64

是不影响排序的结果,如下:

需要注意的是,sort命令默认的分隔符(即一个或多个连续空格字符组成的序列),这些空白字符被看作用于排序字段的一部分,您可以指定 -b 选项来忽略这些开头的空白字符。如下:

如果不是-b命令,它是没有排序的,使用-b命令,就会发现文件是排序好的。

现在,我们再来看一个案例,如下test1.go:

var  re s
var res

如果对test1.go执行sort test1.go命令,结果是什么呢?

为什么会这样呢?

在test1.go文件中,第一个单元包含三个关键字(var re s),第二个单元包含两个关键字(var、res)。第一个关键字相同,都是var。于是比较第二个关键字,一个是res,一个是re,长度不一样怎么比较呢?

具体,原因,我也在探讨中。

猜测:sort命令会将长度不一样的关键字构造成长度一致的,即长度短的关键字会从后面的关键字中借,如果后面没有关键字,则使用空格补齐。于是发现,第二个关键字也相等,但是,第一个担心里面还有一个空格。于是认为第一个单元大一些。

基于上面的猜测测试test2.go如下:

var res
var  res

测试结果如下:

二、常用参数

参数
意义
-b忽略前导空格和制表符。--ignore-leading-blanks的缩写
-d比较中仅考虑字母、数字和空格。--dictionary-order
-f
比较过程中,忽略大小写。 --ignore-case  
-o OutFile将结果输出到OutFile,而不是标准输出流。--output=FILE
-r颠倒指定排序的顺序。--reverse  
-c
检查一个文件是否已经排好序。--check, --check=diagnose-first 
-u输出行中去除重复行。--unique
-k
指定使用哪个关键字排序--key=POS1[,POS2]
-tsort对每一行排序进行排序,如果每一行包含多列,
-h根据文件大小进行排序
-n以数字的方式去比较。


三、案例

1、利用sort命令将班级成绩从大到小排序

班级成员分数如:

lisi 98
xiaoming 89
zhansan 69
zhaoliu 68
wangwu 32

我们知道sort是依赖每一行的关键字排序的,我们可以通过-k指定从哪个关键开始排序,通过上面文件,可以看出,只需从第二个关键字开始排序即可,命令如下:

sort -n -r -k 2 u.txt

-n将关键字看着数字进行比较,-r指定倒序排列,-k 2 ,强调从第二个关键字开始排序。

有的时候,我们的文件并不是以空格来分隔,如下:

lisi:98
xiaoming:98
zhansani:69
zhaoliu:68
wangwu:32

此时,可以借助-t命令,如下:

sort -n -r  -t : -k 2 u.txt