「comm(1)」-

逐行比较两个已排序文件

命令行语法格式

comm [OPTION]… FILE1 FILE2

命令描述

逐行比较两个内容已经排序的文件,输出两个文件中都有的行和独有的行。OPTION是命令行选项,下面会介绍。FILE1FILE2要比较的文件,如果为`-‘表示文件为标准输入读取,但是FILE1/FILE2不能同时为`-‘。

对于命令comm FILE1 FILE2,在没有指定OPTION的情况下,comm命令会输出三列,输出形式如下:

1
2
3
4
5

第1列,FILE1中独有的行。第2列,FILE2中独有的行。第3列,两个文件中都存在的行。列由单个TAB字符分隔。选项-1、-2、-3会禁止打印相应的列,详见选项介绍部分。

命令支持的选项及含义

-1
不打印第一列。即不打印只在FILE1中存在的行。

-2
不打印第二列。即不打印只在FILE2中存在的行。

-3
不打印第三列。即不打印只在FILE1、FILE2中都存在的行。

–checkorder
检查文件是否已经排序。如果给出–check-order选项,未排序的输入将导致错误消息。

–nocheck-order
不检查文件是否排序。如果给出选项–nocheck-order,则未分类的输入永远不会导致错误消息。

–output-delimiter=STR
设置输出列之间的分隔字符为STR。STR不能为空。默认列之间使用TAB进行分隔。

–total
在最后输出一个包含摘要信息的摘要行。该选项是一个GNU扩展选项,在其他的comm实现中,可能没有这个选项。

与常规输出类似,第一列包含只在FILE1中唯一行的总数,第二列包含只在FILE2中唯一行的总数,第三列包含两个文件中共有行的总数,然后后面跟着“total”在附加的第四栏中。

-z, –zero-terminated
使用零字节而不是换行符(ASCII LF)来分隔项目。即,将输入视为由ASCII NUL分隔的项目,并用ASCII NUL终止输出项目。

这个选项可以和’perl -0’或者’find -print0’和’xargs -0’结合使用,它们可以可靠地处理任意文件名(甚至包含空格或其他特殊字符)。

–help
显示帮助信息并退出。

–version
显示版本信息并退出。

文件排序

在使用comm之前,必须使用LC_COLLATE语言环境指定的排序序列对输入文件进行排序。如果输入文件以非换行符结尾,则会自动附加换行符。没有选项的sort(1)命令可以生成适用于comm的输入文件,就是说可以使用sort(1)对文件内容进行排序。

如果没有给出–nocheck-order、–checkorder选项,则仅当发现输入文件包含不可配对的行时才诊断错误排序的输入。如果输入文件被诊断为未排序,则comm命令将以非零状态退出(并且不应使用输出)。

强制通过指定–nocheck-order来处理错误排序的包含不可配对行的输入文件,不保证产生任何特定的输出。输出可能不符合你希望的结果。

退出状态

与其他比较实用程序不同,comm具有不依赖于比较结果的退出状态。正常完成后,comm会产生一个零的退出码。如果出现错误,它将以非零状态退出。

简单示例

打印两个文件都存在的行,即显示第三列:

# comm -12 file1 file2

只存在FILE1中和只存在于FILE2中的行:

# comm -3 file1 file2

参考文献

更新日志

  • 04/04/2016 创建文章
  • 06/09/2018 更新文章内容,参考版本comm命令