迹忆博客
当前位置: 主页 > 学无止境 > 操作系统 > 文章

Linux排序命令sort

发布时间: 2016-09-27 作者: 迹忆 浏览次数:

sort命令是linux中一个常用的排序命令,并且它也是一个管道命令

为了保证以后的实例都能得到我们想要的排序的结果,我们需要进行如下设置

# export LC_ALL=C

好了,接下来我们就正式开始接触sort的用法。

# sort [选项]…[FILE]

-c 检查文件内容是否已经排好序,如果是乱序的,则输出乱序开始的位置信息。

# cat /tmp/sort.txt
a
b
c
d
e
f
k
g
# sort –c /tmp/sort.txt
sort: /tmp/sort.txt:8: disorder: g

我们看到,乱序信息显示的是在/tmp/sort.txt文件中在8行的g处开始乱序。

-b 排序时忽略前面的空格,默认情况下空格也会进行排序的。

# cat /tmp/sort.txt
cat
delete
alpha
glue
error
recruise
Error
   key
hello
# sort /tmp/sort.txt
   key
Error
alpha
cat
delete
error
glue
hello
recruise

我们看,key前面的空格也进行了排序的比较。

# sort –b /tmp/sort.txt   //使用-b选项忽略开头的空格
Error
alpha
cat
delete
error
glue
hello
  key
recruise

-f 忽略大小写,将所有的小写字母转换成大写字母进行比较。

# sort –bf /tmp/sort.txt
alpha
cat
delete
Error
error
glue
hello
 key
recruise

-u 去除重复项

# sort /tmp/sort.txt
alpha
cat
error
error
hello
recruise
//我们看结果中有两个重复项error
# sort –u /tmp/sort.txt //使用-u去除重复项
alpha
cat
error
hello
recruise

-n 使用纯数字来排序,对于数字,默认情况下是将每位上的数字逐个进行比较排序的,使用该选项将用值来进行排序

# cat /tmp/sort.txt
10
2
45
358
21
3
8
# sort /tmp/sort.txt   //默认情况下的排序
10
2
21
3
358
45
8

我们看,10排在了2的前面,而8却排在了最后。

# sort –n /tmp/sort.txt  //使用-n选项
2
3
8
10
21
45
358

使用了-n以后,整个内容是按照值来进行排序了。

-r 将排序结果逆序

# sort –n -r /tmp/sort.txt
358
45
21
10
8
3
2

-o 将排序结果输出到文件中

# sort –n /tmp/sort.txt –o /tmp/sort1.txt
# cat /tmp/sort1.txt
2
3
8
10
21
45
358

当然了,这个我们也可以通过重定向 > 来实现。

# sort –n /tmp/sort.txt > /tmp/sort1.txt

但是,重定向不能用于将数据重定向到原文件

# sort –n /tmp/sort.txt > /tmp/sort.txt
# cat /tmp/sort.txt
//内容为空
# sort –n /tmp/sort.txt –o /tmp/sort.txt

这样 /tmp/sort.txt文件中的内容就是已经排好序的数据了。

哎呀!上面说了这么多了,是不是有点啰嗦了。Sort命令的选项很多,我们就不一一举例了。下面我们再介绍两个选项 –t 和 –k。剩下的我们只介绍其含义。

-t 分隔符,将每一行数据按照该选项指定的分隔符分成多个域。默认情况下是使用tab键或者空格符来分割的。

-k 指定用哪个域的数据来进行排序

-t和-k一般情况下是同时出现的。如果只使用-t的话,系统会默认使用分割以后的第一个域内的数据进行排序

# cat /tmp/sort.txt
onmpw:web:10:jy
onmpw:site:5:www
jiyi:web:8:www
domain:site:10:alph
child:node:5:js
# sort –t ‘:’ /tmp/sort.txt
child:node:5:js
domain:site:10:alph
jiyi:web:8:www
onmpw:site:5:www
onmpw:web:10:jy

很明显是根据第一段的来进行排序的。

# sort –t ‘:’ –k 2 /tmp/sort.txt
child:node:5:js
domain:site:10:alph
onmpw:site:5:www
onmpw:web:10:jy
jiyi:web:8:www

这里着重介绍一下-k选项

-k field[.start[,field.end]][标识][ -k field[.start[,field.end]][标识]]…

通常情况下-k配合-t一起使用,如果单独使用-k的话,那默认的分割符是tab键或者空格符。-k后面指定由哪个域来进行匹配,在一条命令中可以使用多个-k。当第一个-k选项指定的域有重复项的时候再根据第二个-k指定的域,如果还有重复项的话再根据第三个-k指定的域,依次类推得到最后的结果。默认情况下,如果只有一个-k选项,当有重复项的时候会根据第一个域的字段进行匹配。

field就是指定的第几个域;.start表示从该域的字段的第start个字符开始匹配,默认是1;field.end表示到第end个字符截止。也就是说匹配该域字段的start和end之间的字符。end可以省略,如果省略的话表示到该域的末尾。

# cat /tmp/sort.txt
onmpw:web:10:jy
onmpw:site:5:www
jiyi:web:8:www
domain:site:10:alph
child:node:5:js
# sort –t : -k 2.1 /tmp/sort.txt  //从第二个字段的第一个字符开始直到第二个字段的结尾
child:node:5:js
domain:site:10:alph
onmpw:site:5:www
onmpw:web:10:jy
jiyi:web:8:www
# sort –t : -k 2.2,2.3 /tmp/sort.txt //从第二个字段的第二个字符开始直到第三个字符
jiyi:web:8:www
onmpw:web:10:jy
domain:site:10:alph
onmpw:site:5:www
child:node:5:js

我们看上面的结果是不是有较大的出入。再看当第二个字段有相同值的默认情况下是按照第一个域的字段进行匹配的,我们看site那两行数据,再次按照第一个字段的话domain会在onmpw前面。这个不是我们想要的结果,我们想要第二个域的字段相等的时候按照第三个域的字段进行匹配。那就需要用到第二个-k选项了。

# sort –t : -k 2.2,2.3 –k 3 /tmp/sort.txt
onmpw:web:10:jy
jiyi:web:8:www
domain:site:10:alph
onmpw:site:5:www
child:node:5:js

好像和上面的结果没有什么区别哦!没错,结果是一样。但是其排序已经是按照第三个域进行排序了,只是默认情况下不是按照数值排序的,而是也将数字的每一位按照字符排序,所以10排在了5前面。

# sort –t : -k 2.2,2.3 –k 3,3n /tmp/sort.txt
jiyi:web:8:www
onmpw:web:10:jy
onmpw:site:5:www
domain:site:10:alph
child:node:5:js

现在再看结果是不是对了。上面的-k 3,3n 等价于 –k 3n

# sort –t : -k 2.2,2.3 –k 3n /tmp/sort.txt

我们看3后面跟了一个n,这个n就是我们的标识——也就相当于 –n的意思。这里的标识只对当前组有效。什么意思呢?我们在上面的例子中看到根据第二个域的字段排序由两组相同的数据,而-k 3n 是将每一组内的数据作为数据源再进行排序。

可能这样说也是有点模糊,用-n来举例的结果不太明显,现在我们用-r来举例。-r表示的是将排序结果逆序。我们将上面例子中的 –k 3n 换成-k 3nr。

# sort –t : -k 2.2,2.3 –k 3nr /tmp/sort.txt
onmpw:web:10:jy
jiyi:web:8:www
domain:site:10:alph
onmpw:site:5:www
child:node:5:js

我们看结果是不是又不一样了,因为我们在各组内按照第三个域(-k 3n)排好序以后,通过r标识又将其逆序所以就是上面的结果了。那如何看其只是组内有效呢。看下面的例子

# sort –t : -k 2.2,2.3 –k 3n /tmp/sort.txt
jiyi:web:8:www
onmpw:web:10:jy
onmpw:site:5:www
domain:site:10:alph
child:node:5:js
//正常排序,然后我们使用-r来逆序
# sort –t : -r –k 2.2,2.3 –k 3n /tmp/sort.txt
child:node:5:js
onmpw:site:5:www
domain:site:10:alph
jiyi:web:8:www
onmpw:web:10:jy

通过上面的结果我们看出不仅仅是将整体排序的逆序,对于每组内也逆序。

关于sort我们就介绍到这,上面这些是常用的选项,其它剩余选项可以使用命令’info sort’自行查看。希望本文对大家有所帮助。

除非注明转载,本站文章均为原创,欢迎转载,转载请以链接形式注明出处

本文地址: