sort
在计算机中通常会存储很多各种各样的文件,里面甚至会有大量的数据记录,如果这些数据能以某种顺序进行排列,那么在日后的数据维护和查找将会变得非常容易。在Windows操作系统中可进行排序的工具有很多,如MS Excel/SQL Server等,而在Linux中常用的排序命令非sort莫属。sort命令将输入文件当成是由多条记录组成的数据流,可变宽度的字段组成并以换行符做定界符。
基本语法
sort [参数] [要排序的文件]
主要参数如下所示:
参数 | 功能 |
---|---|
-c | 检查文件是否已经按照顺序排序 |
-k | 指定排序的域 |
-m | 合并已排序的文件 |
-n | 按数字大小进行排序 |
-o [输出文件] | 将排序后的文件输出到指定文件,相当于输出重定向到指定文件 |
-r | 将排序结果以逆向显示 |
-t [分隔符] | 指定排序时所用的分隔符,默认为空格符 |
-u | 去掉结果中的重复项 |
sort示例
-
1、-t参数
sort命令对文件排序是分域的。默认的域分隔符是空格符,而-t参数可以指定排序所用的分隔符(相当于根据指定的分隔符先进行分列,再根据默认域排序)。示例如下所示:
-
2、-k参数
sort命令默认情况下是按第1个域进行排序的。如果不想按照默认的域进行排序,该怎么办?sort命令提供了一个参数 -k ,该参数可以按指定的域进行排序。sort命令以数字 1 代表第1域,2代表第2域,依次类推。下面的示例将演示按第3域进行排序,如下所示:
从上面的示例中,可以看到尽管我们想按照域2数字大小进行排序,而实际情况仍然是按字符来进行排序的。解决方案请看下面的-n参数。
-
3、-n参数
在一些情况下,我们需要按照数字大小来进行排序,而sort默认是按字符串进行排序。针对这种情况,我们可以使用参数 -n来达到目的。
-n参数一般不会单独使用,通常与参数-k结合使用,放在域号之后。如-k2n就表示指定以第2个域且按数字大小进行排序。
-
4、-r参数
通常情况我们排序都是按正向排序,如数字通常是从小到大排序。但有些情况,我们如果需要逆向排序,如数字从大到小排序,这时候就需要使用参数-r。示例如下所示:
-
5、-u参数
-u参数通常用于去掉排序结果中的重复项。如在文件添加几行重复项,再使用-u参数进行排序,详细示例如下所示:
-
6、-o参数
默认情况下,sort对排序后的内容是直接输出到标准输出中。对于仅仅查看而言没有太大影响。但如果想要保存排序后的结果怎么办?这时候就该参数-o上场了。详细示例如下所示:
通过该示例,其实我们可以总结出-o参数与Shell中的I/O重定向功能一样。
-
7、-c参数
参数-c使用比较简单,主要用来检查文件是否已经排过序。
-
8、-m参数
参数-m主要用来将已经过排序的文件进行合并。注意,在文件合并前,如果没有排序,虽然也可合并,但意义不大。。
注意排序前和排序后合并的区别
uniq
uniq命令用于去掉文件中的重复项,一般与sort命令结合使用,作用类似于sort -u,但也有一些区别。
基本语法
uniq [参数] [输入文件] [输出文件]
主要参数如下所示:
参数 | 功能 |
---|---|
-c | 输出每行在文件中重复的次数 |
-d | 仅输出重复出现的记录,每个重复记录仅出现一次(连续重复时) |
-u | 仅显示没有重复的记录 |
-d和-u作用刚好相反
sort -u与uniq区别
在了解基本的语法和参数之后,我们先来看看两者的区别,示例如下所示:
从上面的示例可以总结出两者的主要区别如下:
- uniq:去掉的重复行必须是连续重复出现的行,中间不能出现其他文本行
- sort -u:将去掉所有重复的行
uniq示例
-
1、-c参数
如上图所示,前面第一列列出每次重复的次数,而且是连续的行重复次数,如果是分开重复的话,将再做一次统计。
-
2、-d参数
从上图示例可以看出,-d参数将存在连续重复的数据显示出来了,而John+21+Male+Russia虽然也存在重复,但却不是连续,因此未进行显示。
-
3、-u参数
-u是将没有重复的数据显示出来,但为什么显示最后两行依然是重复了,请大家思考一下为什么?