linux命令---sort

来源:互联网 发布:王者荣耀网络问卷调查 编辑:程序博客网 时间:2024/06/06 18:09

说明:基于前几篇文章在写选项的时候带上了长选项格式,排版比较混乱,从本篇文章开始将不再介绍长格式选项,想了解的请对照man自行对应。

概述

  sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。sort命令既可以从特定的文件,也可以从stdin中获取输入。
  sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出


本文基于sort版本:GNU coreutils 8.4


语法

sort [OPTION]... [FILE]...sort [OPTION]... --files0-from=F

选项

Options Details -b 忽略排序字段或关键字中开头的空格 -d 在关键字中只考虑[a-zA-Z0-9]字符. 即处理英文字母、数字及空格字符外,忽略其他的字符 -f 将关键字中的小写字母折合成大写字母. -g 按照通常的数字值顺序作比较,暗含-b -i 在关键字中只考虑[\040-\0176]字符.即除了040至176之间的ASCII字符外,忽略其他的字符 -M 按(未知的)<JAN'<...<DEC’的顺序比较,暗含-b;即将前面3个字母依照月份的缩写进行排序 -h 按自然语言进行比较如2k,1g -n 按照字符串的数值顺序比较,暗含-b -R 通过关键字随机hash排序 -r 颠倒比较的结果. -l 按照当前环境排序. -c 会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1 -C 会检查文件是否已排好序,如果乱序,不输出内容—第一次乱序的内容,仅返回1 -k POS1[,POS2] 从关键字POS1开始,到POS2结束. 字段数和字符偏移量都从1开始计数(与基于零的+POS格式作比较) -m 合并已经排序好的文件,不排序. -o FILE 将结果写入FILE而不是标准输出. -s 通过屏蔽最后的再分类比较来稳定排序. -t SEP 指定排序时所用的栏位分隔字符。使用SEP来替代空格的转换non-. -T DIRECTORY 使用DIRECTORY作为临时文件,而不是$TMPDIR或者/tmp -u 如果有-c,则按严格的顺序进行检查; 如果有-m,则只输出相等顺序的第一个. -z 以0字节结束行,而不是使用换行符,这是为了找到-print0 –help 显示帮助并退出. –version 输出版本信息并退出.

POS为F[.C][OPTS],这里的F指的是字段数,而C为字段中的字符位置,这在-k中是从开始计数的,而在过时的格式中是从零开始的.OPTS可由一个或多个Mbdfinr组成;这有效地屏蔽了对于那个关键字的全局-Mbdfinr设置.如果没有指定关键字,则使用整行作为关键字.如果没有FILE,或者FILE是-,则从标准输入读取

实例

准备文本文件

[root@wmstianjin16172 ~]# cat testSort.txt name    age dept    markyl      30  1   000sl      25  2   130ag      35  5   134uq      26  3   141 uq      26  3   141ag      35  5   134uq      26  3   141Uq      24  3   141

1、不使用任何参数对文件按行进行ASCII码排序

[root@wmstianjin16172 ~]# sort testSort.txtag      35  5   134ag      35  5   134name    age dept    marksl      25  2   130Uq      24  3   141 uq      26  3   141uq      26  3   141uq      26  3   141yl      30  1   000

2、使用-k选项对第二列进行排序

[root@wmstianjin16172 ~]# sort -k2 testSort.txtUq      24  3   141sl      25  2   130 uq      26  3   141uq      26  3   141uq      26  3   141yl      30  1   000ag      35  5   134ag      35  5   134name    age dept    mark

3、使用-n选项,对数字进行排序

[root@wmstianjin16172 ~]# sort -nk2 testSort.txtname    age dept    markUq      24  3   141sl      25  2   130 uq      26  3   141uq      26  3   141uq      26  3   141yl      30  1   000ag      35  5   134ag      35  5   134

4、使用-r选项倒序排列

[root@wmstianjin16172 ~]# sort -rnk2 testSort.txt ag      35  5   134ag      35  5   134yl      30  1   000uq      26  3   141uq      26  3   141 uq      26  3   141sl      25  2   130name    age dept    mark

5、使用-u选项去重

[root@wmstianjin16172 ~]# sort -unk2 testSort.txtname    age dept    markUq      24  3   141sl      25  2   130uq      26  3   141yl      30  1   000ag      35  5   134

当然这里指的是第二列的值重复
6、使用-t选项
用字符’2’替换默认的分隔符TAB

[root@wmstianjin16172 ~]# sort -t2 -nk2 testSort.txtag      35  5   134ag      35  5   134name    age dept    markyl      30  1   000Uq      24  3   141sl      25  2   130 uq      26  3   141uq      26  3   141uq      26  3   141

7、混合选项-t指定分割符,对2,3字段域进行数字排列,对1字段域进行数值排列

[root@wmstianjin16172 ~]# sort -t"2" -nk2,3 -k1 testSort.txtag      35  5   134ag      35  5   134name    age dept    markyl      30  1   000Uq      24  3   141sl      25  2   130 uq      26  3   141uq      26  3   141uq      26  3   141

8、使用-o选项

[root@wmstianjin16172 ~]# sort -t, -nk1 testSort.txt -o sortRes.txt[root@wmstianjin16172 ~]# cat sortRes.txt ag      35  5   134ag      35  5   134name    age dept    marksl      25  2   130Uq      24  3   141 uq      26  3   141uq      26  3   141uq      26  3   141yl      30  1   000

9、使用-R选项

[root@wmstianjin16172 ~]# sort -R testSort.txt  uq      26  3   141sl      25  2   130Uq      24  3   141name    age dept    markuq      26  3   141uq      26  3   141yl      30  1   000ag      35  5   134ag      35  5   134

每次都不一样,不知道它的用处是什么,打乱重新组织?
10、使用-c/-C选项

[root@wmstianjin16172 ~]# sort -C testSort.txt [root@wmstianjin16172 ~]# echo $?1[root@wmstianjin16172 ~]# sort -c testSort.txtsort: testSort.txt:3: disorder: sl      25  2   130[root@wmstianjin16172 ~]# echo $?1

11、-b、-f、-M等就不在此举例了

原创粉丝点击