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。例如:

  1. [root@localhost test]# cat students
  2. Liulu Sichuan Lixia //
  3. Liumin Henan lixia //
  4. Xuli Jiangsu Luolei //
  5. Xiayu Shanxi Hetao //
  6. Liwei Sichuan tangwei //
  7. Heli Xizang Tangwei //
  8. Wangtao Yunnan Huli //
  9. [root@localhost test]# sort students >students_sort
  10. [root@localhost test]# cat students_sort
  11. Liwei Sichuan tangwei //
  12. Xuli Jiangsu Luolei //
  13. Wangtao Yunnan Huli //
  14. Liumin Henan lixia //
  15. Liulu Sichuan Lixia //
  16. Xiayu Shanxi Hetao //
  17. Heli Xizang Tangwei //
  1. [root@localhost test]# sort -o students_sort students

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

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

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

  1. [root@localhost test]# sort -c students_sort
  2. [root@localhost test]# sort -c students
  3. sort: students:: disorder: Liumin Henan lixia //

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

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

  1. [root@localhost test]# cat name1
  2. Tom
  3. Jiim
  4. Lili
  5. Kate
  6. [root@localhost test]# sort -b name1
  7. Jiim
  8. Kate
  9. Lili
  10. Tom
  1. [root@localhost test]# cat name2
  2. Tom
  3. %Kate
  4. Marry
  5. #Lili
  6. [root@localhost test]# sort -d name2
  7. %Kate
  8. #Lili
  9. Marry
  10. Tom

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

  1. [root@localhost test]# sort -f alph
  2. a
  3. b
  4. C
  5. D
  6. e

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

  1. [root@localhost test]# sort num

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

  1. [root@localhost test]# sort -g num

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

  1. [root@localhost test]# sort -M sales
  2. Jan
  3. Feb
  4. Mar
  5. Apr
  6. May
  7. Jun

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

  1. [root@localhost test]# sort -r alph
  2. e
  3. D
  4. C
  5. b
  6. a
  7. [root@localhost test]# sort -r num
都是针对首字母、首位数字而言。

  1.  

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

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

  1. [root@localhost test]# sort -k4 students
  2. Xiayu Shanxi Hetao //
  3. Wangtao Yunnan Huli //
  4. Liulu Sichuan Lixia //
  5. ...

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

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

  1. [root@localhost test]# sort -k5. students
  2. Xuli Jiangsu Luolei //
  3. Liwei Sichuan tangwei //
  4. Xiayu Shanxi Hetao //
  5. Wangtao Yunnan Huli //
  6. Liulu Sichuan Lixia //
  7. Heli Xizang Tangwei //
  8. Liumin Henan lixia //

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

  1. [root@localhost test]# sort -k10n students
  2. Heli Xizang Tangwei //
  3. Liumin Henan lixia //
  4. Wangtao Yunnan Huli //
  5. Xuli Jiangsu Luolei //
  6. Liulu Sichuan Lixia //
  7. Xiayu Shanxi Hetao //
  8. Liwei Sichuan tangwei //
  1. [root@localhost test]# sort -k10g students
  2. Heli Xizang Tangwei //
  3. Liumin Henan lixia //
  4. Wangtao Yunnan Huli //
  5. Xuli Jiangsu Luolei //
  6. Liulu Sichuan Lixia //
  7. Xiayu Shanxi Hetao //
  8. Liwei Sichuan tangwei //

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

  1. [root@localhost test]# sort -k10nr students
  2. Liwei Sichuan tangwei //
  3. Xiayu Shanxi Hetao //
  4. Liulu Sichuan Lixia //
  5. Xuli Jiangsu Luolei //
  6. Wangtao Yunnan Huli //
  7. Liumin Henan lixia //
  8. Heli Xizang Tangwei //
  1. [root@localhost test]# sort -k10gr students
  2. Liwei Sichuan tangwei //
  3. Xiayu Shanxi Hetao //
  4. Liulu Sichuan Lixia //
  5. Xuli Jiangsu Luolei //
  6. Wangtao Yunnan Huli //
  7. Liumin Henan lixia //
  8. Heli Xizang Tangwei //

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

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

  1. [root@localhost test]# sort -k ,2n test

等价命令:

  1. [root@localhost test]# sort -k 1n -k 2n test

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

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

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

  1. [root@localhost test]# sort test >test1
  2. [root@localhost test]# cat test1
  3. How are you?
  4. I am fine, thank you.
  5. I am fine, thank you.
  6. I am fine, thank you.
  7. I am fine, thank you.
  8. Nice to meet you.
  9. Nice to meet you.
  10. Nice to meet you.
  11. [root@localhost test]# sort -c test1
  12. #没有任何返回,说明已经排序
  13. [root@localhost test]# sort -cu test1
  14. sort: test1:: disorder: I am fine, thank you.
  15. #虽然已经经过排序,但有重复行
  16. #删除重复行
  17. [root@localhost test]# sort -u test1
  18. How are you?
  19. I am fine, thank you.
  20. Nice to meet you.

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

  1. [root@localhost test]# cat test1
  2. How are you?
  3. i am fine.
  4. i am fine.
  5. i am fine.
  6. I AM FINE.
  7. I AM FINE.
  8. I AM FINE.
  9. [root@localhost test]# sort -uf test1
  10. How are you?
  11. i am fine.

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

  1. [root@localhost test]# cat test3
  2. aaa
  3. bbb
  4. ccc
  5. zzz
  6. [root@localhost test]# cat test4
  7. ddd
  8. fff
  9. jjj
  10. [root@localhost test]# sort -m test3 test4 >test5
  11. [root@localhost test]# cat test5
  12. aaa
  13. bbb
  14. ccc
  15. ddd
  16. fff
  17. jjj
  18. zzz

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

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

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

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

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

排序命令sort的更多相关文章

  1. 【Linux】排序命令sort

    很多时候,我们都会去计算一次数据里头的相同型态的数据总数,举例来说, 使用 last 可以查得这个月份有登陆主机者的身份.那么我可以针对每个使用者查出他们的总登陆次数吗? 此时就得要排序与计算之类的命 ...

  2. Linux排序命令sort(转)

    Linux sort命令用于将文本文件内容加以排序.sort可针对文本文件的内容,以行为单位来排序. 语法 sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符&g ...

  3. Linux排序命令sort详解

    语法格式sort [ -A ] [ -b ] [ -c ] [ -d ] [ -f ] [ -i ] [ -m] [ -n ] [ -r ] [ -u ] [ -o OutFile ][ -t Cha ...

  4. linux 排序命令sort

    sort [选项] [文件] 选项: -b:忽略每行前面开始出的空格字符: -c:检查文件是否已经按照顺序排序: -d:排序时,处理英文字母.数字及空格字符外,忽略其他的字符: -f:排序时,将小写字 ...

  5. linux常用命令 sort排序命令

    排序命令sort sort [选项] 文件名 选项 -f 忽略大小写 -n 以数值型进行排序,默认使用字符串型进行排序 -r 反向排序 -t 指定分割符,默认的分割符是制表符 -k n[,m] 安装自 ...

  6. 【Linux】排序命令uniq

    很多时候,我们都会去计算一次数据里头的相同型态的数据总数,举例来说, 使用 last 可以查得这个月份有登陆主机者的身份.那么我可以针对每个使用者查出他们的总登陆次数吗? 此时就得要排序与计算之类的命 ...

  7. 2.sort 排序命令讲解

    sort命令  sort:文本排序,仅仅是对显示文件的排序,而不影响源文件的顺序,是根据ASSII码     的字符升序来排列的.        -n:安装数值大小从小到大排列 ,默认是升序.     ...

  8. linux下sort命令使用详解---linux将文本文件内容加以排序命令

    转载自:http://www.cnblogs.com/hitwtx/archive/2011/12/03/2274592.html linux下sort命令使用详解---linux将文本文件内容加以排 ...

  9. 【转载】Redis sort 排序命令详解

    转载地址:http://www.jb51.net/article/69131.htm 本文介绍redis排序命令 redis支持对list,set,sorted set元素的排序 sort 排序命令格 ...

随机推荐

  1. 基于MapReduce的矩阵乘法运算

    1.采用两个MapReduce运算串联来实现 Pik= Mij*Njk 第一步: Map函数:将每个矩阵运算mij传给键值对(j,(M,i,mij)),将每个矩阵元素njk传给键值对(j,(N,k,n ...

  2. [WinForm] 使用 WebBrowser 操作 HTML 頁面的 Element-摘自网络

    前言 在 Window Form 應用程式如果需要瀏覽網頁時可以崁入 WebBrowser 控制項,但如果需要操作崁入的 HTML 的網頁元素,就需要額外的操作,以下紀錄幾種操作 HTML 元素的方法 ...

  3. openstack neutron网络主机节点网口配置 liberty版本之前的

  4. webrtc--AudioProcessing的使用

    1.AudioProcessing的实例化和配置: AudioProcessing* apm = AudioProcessing::Create(0); apm->level_estimator ...

  5. Windows 2003 服务器安全设置-批处理 (附参考链接)

    长期维护windows服务器终结出来的安全设置批处理与大家分享,复制以下全部内容用记事本另存为bat或者cmd执行 ===================分隔符号=================== ...

  6. Mac配置JAVA_HOME

    首先打开终端,输入/usr/libexec/java_home,看到 /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home 说 ...

  7. 使用servlet实现文件上传

    package com.zhanghaobo.fileupload; import java.io.File; import java.io.IOException; import java.util ...

  8. sql waitfor 延时执行

    看MSDN:http://msdn.microsoft.com/zh-cn/library/ms187331.aspx 语法为: WAITFOR { DELAY 'time_to_pass' | TI ...

  9. android ViewConfiguration

    ViewConfiguration 1.有时候要获取一些android UI的中一些默认参数的来进行操作设置,就要用到ViewConfiguration 官方飞解释是:ViewConfiguratio ...

  10. C++ Vector 使用心得 [转]

    标准库Vector类型 使用需要的头文件:#include <vector>Vector:Vector 是一个类模板.不是一种数据类型. Vector<int>是一种数据类型. ...