Linux: 史上最全的sort命令案例,打包带走吧


Linux: 史上最全的sort命令案例,打包带走吧

文章插图
 
一、 介绍
sort命令是用来对文字内容(文档)排序使用的 。同时也可以排序去重、指定字段排序,按照月份排序、按照数字排序,检查文件是否有序等等 。默认情况是按照字典序排序以后标准输出到屏幕上,但是该命令不会修改原来的文档内容 。sort命令通常和uniq命令以及wc命令一起使用 。
二、 用法
sort [OPTION]... [FILE]...选项解释:
-b 忽略开头空格(空白),默认-f 将所有小写字母转换为大写字母排序-g 数字类型排序,效果同 -n-n 字符串数字按照数字排序, 效果同-g-h 以人类可以阅读(理解)的形式排序-c 检查是否排序完成-m 合并两个 文件排序-r 降序(逆序)-o 将排序以后的内容保存文件-k 找到指定的列排序,下标从1开始-u 排序以后去除重复行-t 默认情况下的分隔符为空白符(空格、制表符等),使用-t可以自定义指定分隔符-M 按照月份排序三、 案例
3.0 默认排序
假如month.txt 文件内容如下:
[root@dongjing sort]# cat month.txtJunAprSepJulAug默认排序(不加任何的选项)
[root@dongjing sort]# sort month.txtAprAugJulJunSep默认按照字典序排列
3.1 按照月份排序
[root@dongjing sort]# sort -M month.txtAprJunJulAugSep默认排序只是按照字典序排序,但是对于月份来说并不能符合我们的要求,所以我们使用 -M 按照月份排序
3.2 按照人类阅读排序
假如我们有一个size.txt文件内容如下,我们排序以后可以得到按照大小排序
[root@dongjing sort]# cat size.txt2G30K9M300B30K22M排序
[root@dongjing sort]# sort -h size.txt300B30K30K9M22M2G3.3 排序去重
通过3.2我们看到size.txt文件中30K这个有重复,我们能不能排序的时候就把重复行进行去重呢 。可以通过 -u 选项来完成 。
[root@dongjing sort]# sort -hu size.txt300B30K9M22M2G注意: 这里-h 一定要加的,保证按照数字排序 。
【Linux: 史上最全的sort命令案例,打包带走吧】3.4 倒序(翻转排序)
我们要将size.txt按照从大到小的顺序排序,怎么实现呢?可以使用-r 翻转原来排序的顺序,原先是从小到大,翻转以后就是从大到小了呢 。
[root@dongjing sort]# sort -hr size.txt2G22M9M30K30K300B3.5 保存排序以后的内容到文件中
将size.txt排序以后的结果保存的size_sorted.txt 文件中 。
保存成文件我们可以使用 > 来完成,也可以使用-o 选项后面跟文件名来完成 。
一、 使用> 完成保存
sort -h size.txt > size_sorted.txt二、 使用-o 选项完成
[root@dongjing sort]# sort -h -o size_sorted.txt size.txt注意: 运行完命令不会在屏幕上输出结果 。而是直接保存到文件中了 。
[root@dongjing sort]# ll | grep size-rw-r--r-- 1 root root 23 Sep 16 10:34 size_sorted.txt-rw-r--r-- 1 root root 23 Sep 16 10:23 size.txt3.6 数字排序
假设我们有一个名为number的文件,内容如下:
[root@dongjing sort]# cat number.txt22111110980通过3.1我们已经知道sort默认是按照字典序排序,那么这里先试用sort排序看一下结果:
[root@dongjing sort]# sort number.txt09111112280没有达到我们预期的效果,我们想要的是按照数字大小进行排序 。这里可以使用-n 或者 -g 都可以 。
[root@dongjing sort]# sort -n number.txt09112280111[root@dongjing sort]#[root@dongjing sort]# sort -g number.txt091122801113.7 检查是否有序
判断是否有序可以使用-c 选项实现
[root@dongjing sort]# sort -c number.txtsort: number.txt:2: disorder: 11 # 这里说明第一行的11不是有序的先排序在检查以后,发现没有给出提示,表示已经有序 。
[root@dongjing sort]# sort number.txt | sort -c[root@dongjing sort]#3.8 按照指定列(字段)排序
-k 按照指定的列排序,默认情况下每行按照空白符(空格、制表符等)来分隔列,列的下标从1开始
假如我们有一个score.txt的文件内容如下(每行字段之间使用空格分隔),每隔字段分别代表: 名称 科目 成绩
[root@dongjing sort]# cat score.txtTom Scala 30Tom Scala 30Tom JAVA 30aJack Python 95bJack Python 95Jack Spring 95Mike Java 95Linda linux 85Linda php 66Linda Linux 85XY PHP 100XY Java 55Mike Scala 9SS Shell 99需求:现在我们需要按照成绩由高分到低分排序(结果中不能出现重复行) -- 本题目不关心科目 。
[root@dongjing sort]# sort -u score.txt | sort -k3,3nrXY PHP 100SS Shell 99aJack Python 95bJack Python 95Jack Spring 95Mike Java 95Linda Linux 85Linda PHP 66XY Java 55Tom Java 30Tom Scala 30Mike Scala 9


推荐阅读