Linux排序命令sort

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’自行查看。希望本文对大家有所帮助。

本文转载自:迹忆客(https://www.jiyik.com)

以上是 Linux排序命令sort 的全部内容, 来源链接: utcz.com/z/290116.html

回到顶部