2.11 uniq:忽略文件中的重复行

作用:文件经过处理后在它的输出文件中可能会出现重复的行。例如,使用cat命令将两个文件合并后,再使用sort命令进行排序,就可能出现重复行。这时可以使用uniq命令将这些重复行从输出文件中删除,只留下每条记录的唯一样本。

用法:uniq [选项]...[输入[输出]]

主要选项如下。

● -c:显示输出中,在每行行首加上本行在文件中出现的次数。它可取代-u和-d选项。

● -d:只显示重复行。

● -u:只显示文件中不重复的各行。

● -n:前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。

● +n:前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。

● -f n:与-n相同,这里n是字段数。

● -s n:与+n相同,这里n是字符数。

应用实例如下。

首先看一下示例文件:

        $ cat happy
        Happy Birthday to You!
        Happy Birthday to You!
        Happy Birthday Dear cjh!
        Happy Birthday to You!

(1)显示文件happy中不重复的行

          # uniq -u happy
        Happy Birthday Dear cjh!
        Happy Birthday to You!

(2)显示文件happy中不重复的行,从第2个字段的第2个字符开始做比较

        #uniq -u -1 +1 happy

(3)用-c选项从uniq中获取一些统计信息

        #sort happy | uniq -dc
        3 Happy Birthday to You!

这里uniq命令借助管道命令从标准输入设备读取文件,首先使用sort命令对文件进行排序,然后对排序结果进行操作。

(4)删除文件中重复的行并且输出到一个新文件

        #sort happy|uniq-uniqhappy

操作过程如图2-4所示。

图2-4 删除文件中重复的行并且输出到一个新文件

注意 请不要使用uniq或任何其他工具从包含财务或其他重要数据的文件中除去重复行。在这种情况下,重复行几乎总是表示同一金额的另一个交易,将它除去会给会计部造成许多困难。

(5)高级应用

就算uniq对完整的行进行比较,它仍然会很有用,但是那并非该命令的全部功能。特别方便的是:使用-f选项,后面跟着要跳过的字段数,它能够跳过给定数目的字段。当查看系统日志时这非常有用。通常,某些项要被复制许多次,这使得查看日志很难。使用简单的uniq无法完成任务,因为每一项都以不同的时间戳记开头。但是如果告诉它跳过所有的时间字段,日志一下子就会变得更加便于管理。试一试uniq -f 3 /var/log/messages看看。还有另一个选项-s,它的功能就像-f一样,但是跳过给定数目的字符。可以一起使用-f和–s,uniq先跳过字段,再跳过字符。如果只想使用一些预先设置的字符进行比较,试试-w选项。