学习 Linux,101:文本流和过滤器(6)

sort 将按照系统的 locale(LC_COLLATE)的排序序列来对输入进行排序。sort 命令还可以合并已经排序的文件,并检查某个文件是否已经排序。

清单 14 演示了在将 text1 中的空格转换为制表符后,使用 sort 命令对我们的两个文本文件执行排序。由于是按照字符排序的,因此您可能会对结果感到吃惊。幸运的是,sort 命令可以按照数字值或字符值进行排序。您可以针对整条记录或每个字段 指定排序选项。除非您指定了一个不同的字段分隔符,否则将使用空格或制表符分隔字段。清单 14 中的第二个例子显示对第一个字段按照数字顺序排序,而对第二个字段按照字母顺序排序。它还演示了使用 -u 选项来删除任何重复的行,因此只留下唯一的行。


清单 14. 按字符和数值排序
[ian@echidna lpi103-2]$ cat text1 | tr ' ' '\t' | sort - text2 10 apple 1 apple 2 pear 3 banana 3 banana 9 plum [ian@echidna lpi103-2]$ cat text1|tr ' ' '\t'|sort -u -k1n -k2 - text2 1 apple 2 pear 3 banana 9 plum 10 apple  

注意,我们仍然留有两个包含水果 “apple” 的行,但是刚才已经对两种排序键进行了唯一性检测,在我们的例子中为 k1n 和 k2。想一想如何修改上面的管道或添加一些步骤,以去掉出现的第二个 ‘apple’。

另一个名为 uniq 的命令为我们提供了另一种删除重复行的方式。uniq 命令通常操作已排序的文件,并从文件(不管是否排序)中删除连续的相同行。uniq 命令还可以忽略某些字段。清单 15 将使用第二个字段(水果名)对两个文本文件进行排序,然后去掉相同的行,排序将从第二个字段开始(也就是说,我们在使用 uniq 检测时将跳过第一个字段)。


清单 15. 使用 uniq
[ian@echidna lpi103-2]$ cat text1|tr ' ' '\t'|sort -k2 - text2|uniq -f1 10 apple 3 banana 2 pear 9 plum  

我们的排序是按照字符序列进行的,因此 uniq 显示的是 “10 apple” 行,而不是 “1 apple”。尝试对关键字段 1 添加一个数值排序,看看如何改变这个结果。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/27840.html