comm
命令是 Linux 系统中用于比较两个已排序文件的行的工具。它能够显示出三个部分:仅在第一个文件中存在的行、仅在第二个文件中存在的行,以及两个文件共有的行。comm
要求输入的文件必须先进行排序,否则结果可能不准确。
1. 命令概述
名称:comm
作用:比较两个已排序的文件,逐行输出差异。
核心功能:
- 将输入文件分为三列输出:
- 第一列:仅在
FILE1
中存在的行。 - 第二列:仅在
FILE2
中存在的行。 - 第三列:同时存在于
FILE1
和FILE2
的行。
- 第一列:仅在
- 可通过选项抑制特定列的输出。
基本语法:
comm [OPTION]... FILE1 FILE2
2. 核心选项详解
选项 | 作用 | 示例 |
---|---|---|
-1 | 抑制第一列(仅显示 FILE2 独有行和公共行)。 | comm -1 file1 file2 → 输出第二列和第三列。 |
-2 | 抑制第二列(仅显示 FILE1 独有行和公共行)。 | comm -2 file1 file2 → 输出第一列和第三列。 |
-3 | 抑制第三列(仅显示两个文件独有的行)。 | comm -3 file1 file2 → 输出第一列和第二列。 |
--check-order | 检查输入是否已正确排序,即使所有行可配对。 | comm --check-order file1 file2 → 验证排序。 |
--nocheck-order | 禁用排序检查(默认行为)。 | comm --nocheck-order file1 file2 → 不检查排序。 |
--output-delimiter=STR | 指定列分隔符(默认为制表符)。 | `comm --output-delimiter=" |
--help | 显示帮助信息。 | comm --help → 输出命令用法。 |
--version | 显示版本信息。 | comm --version → 输出版本号。 |
3. 示例与用法
3.1 基础用法
输入文件 file1
:
apple
banana
cherry
date
输入文件 file2
:
banana
grape
apple
orange
命令:
comm file1 file2
输出:
apple banana grape orange
banana
cherry
date
apple
grape
orange
解释:
- 第一列:仅在
file1
中的行(cherry
,date
)。 - 第二列:仅在
file2
中的行(grape
,orange
)。 - 第三列:公共行(
apple
,banana
)。
3.2 常用选项组合
示例1:显示公共行(交集)
comm -12 file1 file2
输出:
apple
banana
示例2:显示仅在各自文件中的行(差集)
comm -3 file1 file2
输出:
cherry date
grape orange
示例3:自定义分隔符
comm --output-delimiter=" | " file1 file2
输出:
apple | banana grape orange
banana |
cherry |
date |
apple |
grape |
orange |
4. 注意事项
-
文件必须已排序:
comm
要求输入文件按字典序排序(默认由LC_COLLATE
环境变量控制)。- 若未排序,输出结果不可靠。
解决方法:
comm <(sort file1) <(sort file2)
-
空行处理:
- 空行会被视为普通行参与比较。
- 若需忽略空行,可用
grep
过滤:comm <(sort file1 | grep .) <(sort file2 | grep .)
-
排序检查:
--check-order
会检查输入是否已正确排序,若发现无序行会报错。- 适用于需要确保输入合法的场景。
-
多字节字符:
- 排序规则受
LC_COLLATE
环境变量影响,支持本地化排序(如中文、特殊符号)。
- 排序规则受
5. 与 diff
的对比
comm
:- 仅适用于已排序的文件。
- 输出三列,适合快速查看交集和差集。
diff
:- 不要求文件排序,逐行比较差异。
- 输出详细差异(如行号、增删内容)。
示例:
diff file1 file2 # 显示具体行差异
comm -12 file1 file2 # 仅显示公共行
6. 实际应用场景
-
场景1:数据库表对比
comm -3 table1_sorted.txt table2_sorted.txt
输出两个表中不一致的行。
-
场景2:日志文件差异分析
comm -12 log1_sorted.log log2_sorted.log > common_errors.log
提取两个日志文件中的共同错误信息。
-
场景3:文件去重
结合sort
和comm
实现:sort file1 file2 | uniq > merged_unique.txt
7. 常见问题解答
Q1:文件未排序时如何使用 comm
?
A:先排序:
comm <(sort file1) <(sort file2)
Q2:如何仅显示 FILE1
中独有的行?
A:用 -23
抑制其他列:
comm -23 file1 file2
Q3:如何处理大文件?
A:comm
效率高,适合处理 GB 级排序后的文件,但需确保内存足够。