zoukankan      html  css  js  c++  java
  • 排序命令sort

    Unix和Linux自带的sort命令功能非常强大,其主要功能是对文本内容按不同的方法排序。它不仅可以按一个或多个字段排序,还可以合并文件。使用sort处理一些较大的文件时,可能处理速度会比较慢,但却非常有效。

    • 命令格式:

    sort [option] [file]

    sort处理的文本可以来自一个文本文件,也可以来自标准输入和管道等。

    • 常用选项:

    b:按字典顺序进行排序,忽略前面的空格或制表符。

    d:按字典顺序进行排序,将除空格和字母以外的字符排除。

    f:忽略大小写。

    g:根据数值进行排序,默认从小到大(可以配合r使用按数值从大到小排序)。

    i:只考虑可打印的字符。

    M:将字符按月份进行比较,例如JAN<…<DEC。

    n:按数值进行比较排序,默认从小到大(可以配合r使用按数值从大到小)。

    r:反向排序(按首个数字从大到小,而不是按数值从大到小,字母按逆序)。

    c:测试文件内容是否已经进行了排序,若无任何返回信息,则表示已经执行了排序操作。

    k:指定排序的关键字。

    m:合并已经排序的文件,不进行排序。

    o:将结果写入文件内,不再输出到标准输出。

    s:通过屏蔽最后的分类进行稳定排序。

    t:使用指定的字符作为字段分隔符。

    T:将临时文件放入指定的目录内。

    u:如果与选项c一起使用,则检查是否在排序时已经去除重复的行,没有选项c时,则在排序时去掉重复的行。

    z:用一个0字节作为结束,而不是一个换行符。

    默认情况下,sort同awk一样,使用空格或制表符Tab来分割字段。如果要排序的文件不是以空格或制表符作为字段分隔符,应该使用t选项指定分隔符。分割后就可以按字段进行排序了。排序既可以按某个字段进行排序,也可以按整行排序。

    • 用法示例:

    (1)在使用sort命令对文本进行排序时,sort默认会将排序结果输出到标准输出。如果要保存到文件,可以使用重定向或选项o。例如:

    [root@localhost test]# cat students
    2821020225 Liulu        Sichuan Lixia   01/23/93        89 76 88 72 325 81
    2821020115 Liumin       Henan   lixia   05/14/94        78 65 59 78 280 70
    2721020321 Xuli         Jiangsu Luolei  12/25/92        76 81 85 79 321 80
    2921020632 Xiayu        Shanxi  Hetao   03/26/93        78 86 92 78 334 84
    2721010409 Liwei        Sichuan tangwei 11/21/92        98 88 85 85 356 89
    2921050313 Heli         Xizang  Tangwei 07/12/94        56 78 80 45 259 65
    2721030227 Wangtao      Yunnan  Huli    03/21/93        87 76 69 88 320 80
    [root@localhost test]# sort students >students_sort
    [root@localhost test]# cat students_sort
    2721010409 Liwei        Sichuan tangwei 11/21/92        98 88 85 85 356 89
    2721020321 Xuli         Jiangsu Luolei  12/25/92        76 81 85 79 321 80
    2721030227 Wangtao      Yunnan  Huli    03/21/93        87 76 69 88 320 80
    2821020115 Liumin       Henan   lixia   05/14/94        78 65 59 78 280 70
    2821020225 Liulu        Sichuan Lixia   01/23/93        89 76 88 72 325 81
    2921020632 Xiayu        Shanxi  Hetao   03/26/93        78 86 92 78 334 84
    2921050313 Heli         Xizang  Tangwei 07/12/94        56 78 80 45 259 65
    [root@localhost test]# sort -o students_sort students

    使用o选项保存结果时,如果指定的保存位置和输入的文件是同一个文件,sort会将结果保存在临时文件内,等排序结束才将结果写入。

    提示:应尽量避免将输出保存到输入的文件中,特别是对一些较长的文件进行操作时,意外的错误可能会导致数据丢失。

    (2)在对文件进行合并、连接之前,应该先检查文件是否已经执行了排序。可以使用c选项检测文件是否已经进行了排序。例如:

    [root@localhost test]# sort -c students_sort
    [root@localhost test]# sort -c students
    sort: students:2: disorder: 2821020115 Liumin   Henan   lixia   05/14/94        78 65 59 78 280 70

    如果文件已经排序,sort将不会返回任何结果。若没有排序,则返回相关提示信息。

    (3)有时文件的行前面可能会出现一些特别的字符,影响排序的结果。这时查看文件内容并结合使用选项b和d可以排除这些字符的干扰。例如:

    [root@localhost test]# cat name1
    Tom
            Jiim
    Lili
            Kate
    [root@localhost test]# sort -b name1
            Jiim
            Kate
    Lili
    Tom
    [root@localhost test]# cat name2
    Tom
            %Kate
    Marry
            #Lili
    [root@localhost test]# sort -d name2
            %Kate
            #Lili
    Marry
    Tom

    (4)在某些系统中,sort排序会对大写字母和小写字母区别对待。这时为了避免手动输入时产生的失误,需要将小写字母和大写字母同等对待,可以使用f选项,例如:

    [root@localhost test]# sort -f alph
    a
    b
    C
    D
    e

    (5)默认情况下,sort总是先看第1行的第1个字符,如果第1个字符相同,则比较第2个字符,依次类推。但是有数字出现的情况则不同,默认情况下,数字1会排在数字2的前面:

    [root@localhost test]# sort num
    1
    123
    25
    98

    如果统计数字,可能用户更希望sort按数值从小到大排序,此时应该使用选项g让sort按数值从小到大进行排序:

    [root@localhost test]# sort -g num
    1
    25
    98
    123

    (6)有时为了统计一些数据,需要按月份进行排序,比如一个含义销售数据的文本,需要按月份统计销量或金额,此时可以配合使用选项M:

    [root@localhost test]# sort -M sales
    Jan 223
    Feb 443
    Mar 433
    Apr 445
    May 555
    Jun 233

    (7)可以使用选项r进行反向排序(字母或数字从大到小的顺序):

    [root@localhost test]# sort -r alph
    e
    D
    C
    b
    a
    [root@localhost test]# sort -r num
    98
    25
    123
    1
    都是针对首字母、首位数字而言。
     

    (8)通常,sort都使用第1个域作为排序的关键序。然而有时我们关心的内容不在第1个字段,这时就要用到选项k对指定域排序。

    例如在students中按学生的辅导员进行排序:

    [root@localhost test]# sort -k4 students
    2921020632 Xiayu        Shanxi  Hetao   03/26/93        78 86 92 78 334 84
    2721030227 Wangtao      Yunnan  Huli    03/21/93        87 76 69 88 320 80
    2821020225 Liulu        Sichuan Lixia   01/23/93        89 76 88 72 325 81
    ...

    (9)有时可能对排序的要求更严格,一个典型的例子是某个字段中一个或多个字符指明了产品的产地。这时可以先用一个数字确定要排序的关键域,然后用点号“.”加域中的第几个字符指定排序关键字符。

    例如在学生信息文件students中,按学生出生的年份进行排序,出生日期在文本的第5个字段,而年份在第5个字段的第8个字符。因此可以使用一下命令:

    [root@localhost test]# sort -k5.8 students
    2721020321 Xuli         Jiangsu Luolei  12/25/92        76 81 85 79 321 80
    2721010409 Liwei        Sichuan tangwei 11/21/92        98 88 85 85 356 89
    2921020632 Xiayu        Shanxi  Hetao   03/26/93        78 86 92 78 334 84
    2721030227 Wangtao      Yunnan  Huli    03/21/93        87 76 69 88 320 80
    2821020225 Liulu        Sichuan Lixia   01/23/93        89 76 88 72 325 81
    2921050313 Heli         Xizang  Tangwei 07/12/94        56 78 80 45 259 65
    2821020115 Liumin       Henan   lixia   05/14/94        78 65 59 78 280 70

     (10)将文本students中学生信息按总成绩从小到大排序:

    [root@localhost test]# sort -k10n students
    2921050313 Heli         Xizang  Tangwei 07/12/94        56 78 80 45 259 65
    2821020115 Liumin       Henan   lixia   05/14/94        78 65 59 78 280 70
    2721030227 Wangtao      Yunnan  Huli    03/21/93        87 76 69 88 320 80
    2721020321 Xuli         Jiangsu Luolei  12/25/92        76 81 85 79 321 80
    2821020225 Liulu        Sichuan Lixia   01/23/93        89 76 88 72 325 81
    2921020632 Xiayu        Shanxi  Hetao   03/26/93        78 86 92 78 334 84
    2721010409 Liwei        Sichuan tangwei 11/21/92        98 88 85 85 356 89
    [root@localhost test]# sort -k10g students
    2921050313 Heli         Xizang  Tangwei 07/12/94        56 78 80 45 259 65
    2821020115 Liumin       Henan   lixia   05/14/94        78 65 59 78 280 70
    2721030227 Wangtao      Yunnan  Huli    03/21/93        87 76 69 88 320 80
    2721020321 Xuli         Jiangsu Luolei  12/25/92        76 81 85 79 321 80
    2821020225 Liulu        Sichuan Lixia   01/23/93        89 76 88 72 325 81
    2921020632 Xiayu        Shanxi  Hetao   03/26/93        78 86 92 78 334 84
    2721010409 Liwei        Sichuan tangwei 11/21/92        98 88 85 85 356 89

     如果要从大到小排序,可以用n或g配合反向r使用:

    [root@localhost test]# sort -k10nr students
    2721010409 Liwei        Sichuan tangwei 11/21/92        98 88 85 85 356 89
    2921020632 Xiayu        Shanxi  Hetao   03/26/93        78 86 92 78 334 84
    2821020225 Liulu        Sichuan Lixia   01/23/93        89 76 88 72 325 81
    2721020321 Xuli         Jiangsu Luolei  12/25/92        76 81 85 79 321 80
    2721030227 Wangtao      Yunnan  Huli    03/21/93        87 76 69 88 320 80
    2821020115 Liumin       Henan   lixia   05/14/94        78 65 59 78 280 70
    2921050313 Heli         Xizang  Tangwei 07/12/94        56 78 80 45 259 65
    [root@localhost test]# sort -k10gr students
    2721010409 Liwei        Sichuan tangwei 11/21/92        98 88 85 85 356 89
    2921020632 Xiayu        Shanxi  Hetao   03/26/93        78 86 92 78 334 84
    2821020225 Liulu        Sichuan Lixia   01/23/93        89 76 88 72 325 81
    2721020321 Xuli         Jiangsu Luolei  12/25/92        76 81 85 79 321 80
    2721030227 Wangtao      Yunnan  Huli    03/21/93        87 76 69 88 320 80
    2821020115 Liumin       Henan   lixia   05/14/94        78 65 59 78 280 70
    2921050313 Heli         Xizang  Tangwei 07/12/94        56 78 80 45 259 65

     (11)在使用选项k时,也可以指定多个字段排序,方法是使用逗号“,”将多个字段分开,也可以使用多个选项k指定字段。

    (先按前面指定的字段排序,若相同,再按总后面字段排序):

    [root@localhost test]# sort -k 1,2n test
    1       333
    2       222
    2       555
    3       111
    3       444

    等价命令:

    [root@localhost test]# sort -k 1n -k 2n test
    1       333
    2       222
    2       555
    3       111
    3       444

    (12)有时要处理的文本并不是以空格或制表符作为字段分隔符,这时应该使用选项t指定分隔符排序,例如:

    [root@localhost test]# sort -t# -k3 test
    1#2#2#4
    2#4#5#8
    4#2#7#8
    3#2#9#5

    (13)当一个文本有一个或多个重复的行时,可以使用u检查或去除重复的行。

    [root@localhost test]# sort test >test1
    [root@localhost test]# cat test1
    How are you?
    I am fine, thank you.
    I am fine, thank you.
    I am fine, thank you.
    I am fine, thank you.
    Nice to meet you.
    Nice to meet you.
    Nice to meet you.
    [root@localhost test]# sort -c test1
    #没有任何返回,说明已经排序
    [root@localhost test]# sort -cu test1
    sort: test1:3: disorder: I am fine, thank you.
    #虽然已经经过排序,但有重复行
    #删除重复行
    [root@localhost test]# sort -u test1
    How are you?
    I am fine, thank you.
    Nice to meet you.

    (15)可以使用选项u和f在删除重复行时忽略大小写:

    [root@localhost test]# cat test1
    How are you?
    i am fine.
    i am fine.
    i am fine.
    I AM FINE.
    I AM FINE.
    I AM FINE.
    [root@localhost test]# sort -uf test1
    How are you?
    i am fine.

     (16)sort命令还可以合并文本,但通常推荐合并的多个文本应该具有相似的结构,以便于合并后阅读和使用。例如:

    [root@localhost test]# cat test3
    aaa     111
    bbb     222
    ccc     333
    zzz     000
    [root@localhost test]# cat test4
    ddd     444
    fff     555
    jjj     999
    [root@localhost test]# sort -m test3 test4 >test5
    [root@localhost test]# cat test5
    aaa     111
    bbb     222
    ccc     333
    ddd     444
    fff     555
    jjj     999
    zzz     000

    在上面的示例中,test3和test4已经过排序,sort先将两个文件合并,然后执行排序并将结果重定向到test5.

    注意:在对文件执行合并操作之前,应该先对要合并的文件排序。

    (17)管理和维护系统时,为了更为直观地查看命令输出信息,也经常用到sort命令对其他命令的输出排序。例如查看/etc目录中最大的5个文件:

    [root@localhost test]# ls -l /etc | awk '{print $1,$5,$9}' | sort -n -k2 | tail -5
    -rw-r--r-- 22060 fb.modes
    -rw-r--r-- 31303 jwhois.conf
    -rw-r--r-- 37478 ld.so.cache
    -rw-r--r-- 362031 services
    -rw-r--r-- 807103 termcap

    注意:sort命令在不同的系统上运行,产生的结果可能会有差异。

  • 相关阅读:
    Error: Client network socket disconnected before secure TLS connection was established
    python对文章词频的统计
    IntelliJ IDEA创建java空项目
    java提取docx文件中的图片
    vue v-for 循环复选框-默认勾选第一个的实现方法
    nodejs的request创建的get和post请求,带参数
    python list转换字符串报错TypeError: sequence item 0: expected str instance, int found
    linux常用命令
    ES9(2018) 正则表达式命名捕获组
    ESLint+Prettier代码规范实践
  • 原文地址:https://www.cnblogs.com/nufangrensheng/p/3464131.html
Copyright © 2011-2022 走看看