您的位置:首页 > 运维架构 > Shell

Shell中的sort排序命令的使用

2015-11-15 19:57 513 查看
sort简介

   sort命令可以依据不同的数据类型进行排序,其语法及常用参数格式:

  sort [-bcfMnrtk][源文件][-o 输出文件] 

   补充说明:sort可针对文本文件的内容,以行为单位来排序。

参数:
  -b   忽略每行前面开始出的空格字符。

  -c   检查文件是否已经按照顺序排序。

  -f   排序时,忽略大小写字母。

  -M   将前面3个字母依照月份的缩写进行排序。

  -n   依照数值的大小排序。

  -o<输出文件>   将排序后的结果存入指定的文件。

  -r   以相反的顺序来排序。

  -t<分隔字符>   指定排序时所用的栏位分隔字符。

  -k  选择以哪个区间进行排序。

使用举例

   (1)sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

    #cat seq.txt

    banana

    apple

    pear

    orange

    #sort seq.txt

    apple

    banana

    orange

    pear

    用户可以保存排序后的文件内容,或把排序后的文件内容输出至打印机。下例中用户把排序后的文件内容保存到名为result.txt的文件中。

    #sort seq.txt > result.txt

   (2)sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。

    #sort -r seq.txt

    pear

    orange

    banana

    apple

   (3)由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile。但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。

    #sort -r seq.txt > seq.txt

    #cat seq.txt

    #

    看,竟然将seq.txt文件清空了。就在这个时候,-o选项出现了,它成功的解决了这个问题,它能将结果写入原文件。这或许也是-o比重定向的唯一优势所在。

    # sort -r seq.txt -o seq.txt

   (4)你有没有遇到过10比2小的情况,出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!

# cat /etc/passwd | awk 'BEGIN{FS=":"}{print $3"\t"$1}' | sort

0 root

10 uucp

11 operator

12 games

13 gopher

14 ftp

16 oprofile

173 abrt

1 bin

29 rpcuser

2 daemon

32 rpc

38 ntp

3 adm

499 saslauth

4 lp

500 tang

501 hadoop

5 sync

65534 nfsnobody

68 haldaemon

69 vcsa

6 shutdown

72 tcpdump

74 sshd

7 halt

81 dbus

89 postfix

8 mail

99 nobody

# cat /etc/passwd | awk 'BEGIN{FS=":"}{print $3"\t"$1}' | sort -n

0 root

1 bin

2 daemon

3 adm

4 lp

5 sync

6 shutdown

7 halt

8 mail

10 uucp

11 operator

12 games

13 gopher

14 ftp

16 oprofile

29 rpcuser

32 rpc

38 ntp

68 haldaemon

69 vcsa

72 tcpdump

74 sshd

81 dbus

89 postfix

99 nobody

173 abrt

499 saslauth

500 tang

501 hadoop

65534 nfsnobody

  (5)sort的-t选项和-k选项可以实现按照指定的列排序

   如果有一个文件的内容是这样:

   # cat facebook.txt

    banana:30:5.5

    apple:10:2.5

    pear:90:2.3

    orange:20:3.4

   这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实现?幸好,sort提供了-t选项,后面可以设定间隔符。指定了间隔符之后,就可以用-k来指定列数了。

  # sort -n -t‘:’-k 2  facebook.txt

   apple:10:2.5

   orange:20:3.4

   banana:30:5.5

   pear:90:2.3
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux shell