一、简介
sort命令主要排序文件、对已排序的文件进行合并,并检查文件以确定它们是否已排序等。工作原理是将文件的每一行作为一个单元,每个单元可以包含多个排序关键字,默认情况下通过空格将单元分为多个排序关键字,然后逐一相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按一定顺序(默认是升序)输出。如果未指定任何文件名,那么该命令对标准输入排序。
由于sort命令很多参数都围绕着排序关键字,有必要很好理解这个排序关键字。sort命令是以行为单元,如下文件test.go:
var res []float64 var name string
包含了两个单位,默认情况下sort会以空格去分隔每个单元(当然我们可以通过参数-t去指定分隔符),所以,第一个单元包含三个排序关键字var、res以及[]float64。第二个单元也包含三个排序关键字var、name以及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] |
-t | sort对每一行排序进行排序,如果每一行包含多列, |
-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
若您感觉本站文章不错,读后有收获,不妨赞助一下?
我要赞助