linux shell sort排序命令

shell 2019-12-29 阅读 402 评论 0

Linux下 shell 的 sort命令可用于对输入内容进行排序,也可以对文本文件的内容逐行排序。使用sort命令的选项,支持按字母顺序、逆序、按数字、按月排序,还可以删除重复项。sort还可以对不在行首的项进行排序,排序时可以忽略大小写,默认情况下,空格是分隔符,分割行内每一项。

sort 命令将以默认的方式将文本文件的第一列以ASCII 码的次序排列。

sort用法

用法:sort [选项]... [文件]...
 或:sort [选项]... --files0-from=F
Write sorted concatenation of all FILE(s) to standard output.

Mandatory arguments to long options are mandatory for short options too.
排序选项:

  -b, --ignore-leading-blanks	忽略前导的空白区域
  -d, --dictionary-order	只考虑空白区域和字母字符
  -f, --ignore-case		忽略字母大小写
  -g, --general-numeric-sort  compare according to general numerical value
  -i, --ignore-nonprinting    consider only printable characters
  -M, --month-sort            compare (unknown) < 'JAN' < ... < 'DEC'
  -h, --human-numeric-sort    使用易读性数字(例如: 2K 1G)
  -n, --numeric-sort		根据字符串数值比较
  -R, --random-sort		根据随机hash 排序
      --random-source=文件	从指定文件中获得随机字节
  -r, --reverse			逆序输出排序结果
      --sort=WORD		按照WORD 指定的格式排序:
					一般数字-g,高可读性-h,月份-M,数字-n,
					随机-R,版本-V
  -V, --version-sort		在文本内进行自然版本排序

其他选项:

      --batch-size=NMERGE	一次最多合并NMERGE 个输入;如果输入更多
					则使用临时文件
  -c, --check, --check=diagnose-first	检查输入是否已排序,若已有序则不进行操作
  -C, --check=quiet, --check=silent	类似-c,但不报告第一个无序行
      --compress-program=程序	使用指定程序压缩临时文件;使用该程序
					的-d 参数解压缩文件
      --debug			为用于排序的行添加注释,并将有可能有问题的
					用法输出到标准错误输出
      --files0-from=文件	从指定文件读取以NUL 终止的名称,如果该文件被
					指定为"-"则从标准输入读文件名
  -k, --key=KEYDEF          sort via a key; KEYDEF gives location and type
  -m, --merge               merge already sorted files; do not sort
  -o, --output=文件		将结果写入到文件而非标准输出
  -s, --stable			禁用last-resort 比较以稳定比较算法
  -S, --buffer-size=大小	指定主内存缓存大小
  -t, --field-separator=分隔符	使用指定的分隔符代替非空格到空格的转换
  -T, --temporary-directory=目录	使用指定目录而非$TMPDIR 或/tmp 作为
					临时目录,可用多个选项指定多个目录
      --parallel=N		将同时运行的排序数改变为N
  -u, --unique		配合-c,严格校验排序;不配合-c,则只输出一次排序结果
  -z, --zero-terminated	以0 字节而非新行作为行尾标志
      --help		显示此帮助信息并退出
      --version		显示版本信息并退出

对文件进行排序并输出

语法:

$ sort filename.txt

假设创建了文件file.txt

$ cat file.txt 
abhishek
watish
123test
zajan
Wechat
divyam
$ sort file.txt 
123test
abhishek
divyam
watish
Wechat
zajan

当有一个文件包含大写和小写字母的混合时,首先忽略大小写,即是都当成是小写字母,从第一位开始往后对比,如果还判断不出结果,再按照实际的大小写对比。如

$ cat mix.txt
Appla
abc
abcd
ABC
apple
$ sort mix.txt 
abc
ABC
abcd
Appla
apple

将文件进行排序并输出另一个文件 -o

可以使用 -o 参数,或者 “>” 符号

语法

$ sort inputfile.txt > filename.txt
$ sort -o filename.txt inputfile.txt

倒序排列 -r

sort 命令默认是升序排列,加上 -r 参数,可以实现倒序排列

语法

$ sort -r inputfile.txt
$ sort -r file.txt 
zajan
Wechat
watish
divyam
abhishek
123test

数字排序 -n

默认情况下,sort命令会把数字当做字符来执行标准的字符排序,产生的输出可能根本就不是你要的,解决这个问题可用 -n 参数,它会告诉sort命令把数字识别成数字而不是字符,并按值排序。

语法

$ sort -n filename.txt

示例

$ cat number.txt
50
39
15
89
200

对数字进行正序排列

$ sort -n number.txt
15
39
50
89
200

对数字进行倒序排列

$ sort -rn number.txt
200
89
50
39
15

按照指定列排序 -k

sort 命令提供了使用 -k 选项根据任何列号对表进行排序的功能。使用 -k 选项对特定列进行排序。 例如,使用“ -k 2”对第二列进行排序。

语法

$ sort -k filename.txt

示例,创建2列的文件

$ cat employee.txt
manager   5000
clerk     4000
employee  6000
peon      4500
director  9000
guard     3000

对第2列进行正序排列

$ sort -k 2n employee.txt
guard     3000
clerk     4000
peon      4500
manager   5000
employee  6000
director  9000

检查是否已经排序 -c

检查输入是否已排序,如没有输出,表示已经排好序。

语法

$ sort -c filename.txt
$ cat cars.txt 
Audi
Cadillac
BMW
Dodge
$ sort -c cars.txt
sort:cars.txt:3:无序: BMW

去掉文件中重复的行 -u

要排序和删除文件中的重复项,可以通过 -u 选项。 这会将排序列表写入到标准输出,并删除重复项。此选项挺有用,特别是需要删除重复某一列的行记录。

语法

$ sort -u filename.txt

示例

$ cat duplication.txt 
less
cat
unique
vim
vi
unique

去重排序:

$ sort -u duplication.txt 
cat
less
unique
vi
vim

按月份名称排序 -M

$ sort -M filename.txt
$ cat months.txt
February
January
March
August
September
$ sort months.txt
August
February
January
March
September

sort 多列正排序,倒排序

比如有这样一个数据,第1列是名字,第2列是年龄,第3列是收入。按照英文字母 “,” 分割

$ cat multiple.txt 
张三,26,5000
李四,30,3000
王五,26,4500
陈六,23,5000

sort命令的 -t 选项,是指定分隔符,默认是空格。

按照收入从高到低排列

$ sort -t ',' -k 3r multiple.txt 
陈六,23,5000
张三,26,5000
王五,26,4500
李四,30,3000

按照收入从高到低排列,并且按照年龄从小到大排列

$ sort -t ',' -k 3r -k 2r multiple.txt 
张三,26,5000
陈六,23,5000
王五,26,4500
李四,30,3000
最后更新 2019-12-29