Comm:逐行比较两个已排序文件

来自泡泡学习笔记
跳到导航 跳到搜索

comm将标准输出写入到两个输入文件的公共和唯一行;一个文件名为“-”表示标准输入。概要:

comm [选项]… 文件1 文件2


在使用comm之前,输入文件必须使用由LC_COLLATE区域设置指定的排序序列进行排序。如果输入文件以非换行符结尾,将静默添加换行符。不带选项的sort命令总是输出适合comm输入的文件。


不带选项,comm产生三列输出。第一列包含仅属于文件1的行,第二列包含仅属于文件2的行,第三列包含两个文件共有的行。列之间用单个TAB字符分隔。

选项-1、-2和-3抑制打印相应的列(和分隔符)。


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

如果给定了–check-order选项,未排序的输入将导致致命错误消息。如果给定了–nocheck-order选项,未排序的输入永远不会导致错误消息。如果没有给出这些选项之一,只有当输入文件发现无法配对的行时才会诊断错误的排序输入。如果输入文件被诊断为未排序,comm命令将以非零状态(输出不应被使用)退出。


通过指定–nocheck-order强制处理包含无法配对行的排序错误输入文件并不保证会产生任何特定输出。输出可能不会与您希望的输出相符。


选项

‘–check-order’

如果任何一个输入文件错误排序,则失败并显示错误消息。


‘–nocheck-order’

不要检查两个输入文件是否都按排序顺序排列。


‘–output-delimiter=str’

在相邻输出列之间打印str,而不是默认的单个TAB字符。

分隔符str可以为空,在这种情况下,ASCII NUL字符用于分隔输出列。


‘–total’

在末尾输出摘要。


类似于常规输出,第一列包含仅属于文件1的总行数,第二列包含仅属于文件2的总行数,第三列包含两个文件共有的总行数,后面是额外的列四中的单词“total”。


在以下示例中,comm省略了常规输出(-123),因此只打印摘要:

$ printf '%s\n' a b c d e     > file1
$ printf '%s\n'   b c d e f g > file2
$ comm --total -123 file1 file2
1       2       4       total


此选项是GNU扩展。可移植脚本应使用wc获取总数,例如对于上述示例文件:

$ comm -23 file1 file2 | wc -l    # 仅在file1中的行数
1
$ comm -13 file1 file2 | wc -l    # 仅在file2中的行数
2
$ comm -12 file1 file2 | wc -l    # 两个文件共有的行数
4


‘-z’

‘–zero-terminated’

用零字节而不是换行符(ASCII LF)分隔项目。即,将输入视为由ASCII NUL分隔的项目,并以ASCII NUL终止输出项目。此选项可以与“perl -0”或“find -print0”以及“xargs -0”一起使用,以便可靠地处理任意文件名(即使其中包含空格或其他特殊字符)。