comm比较两个已排序的文件

2025-04发布6次浏览

正文

comm 是一个用于比较两个已排序文件的 Linux 命令行工具。它会逐行比较两个文件的内容,并输出三个列:仅在第一个文件中出现的行、仅在第二个文件中出现的行以及两个文件中共有的行。为了正确使用 comm,输入的文件必须是按字典顺序排序的。

使用场景

  • 比较两个文本文件中的差异。
  • 找出两个文件中共有的内容或唯一的部分。
  • 数据分析和去重操作。

基本语法

comm [选项] 文件1 文件2

选项说明

  • -1:抑制仅在第一个文件中出现的行(第一列)。
  • -2:抑制仅在第二个文件中出现的行(第二列)。
  • -3:抑制两个文件中共有的行(第三列)。
  • -u:以未排序的方式处理输入(某些实现支持)。

实践步骤

步骤 1: 准备两个已排序的文件

首先,我们需要创建两个已排序的文件。如果文件未排序,可以使用 sort 命令对文件进行排序。

假设我们有两个文件 file1.txtfile2.txt

# file1.txt 内容
apple
banana
cherry

# file2.txt 内容
banana
cherry
date

确保文件已排序:

sort file1.txt -o file1.txt
sort file2.txt -o file2.txt
步骤 2: 使用 comm 进行比较

运行以下命令来比较两个文件:

comm file1.txt file2.txt

输出结果

    banana
    cherry
apple
        date

解释:

  • 第一列:仅在 file1.txt 中出现的行(如 apple)。
  • 第二列:仅在 file2.txt 中出现的行(如 date)。
  • 第三列:两个文件中共有的行(如 bananacherry)。
步骤 3: 抑制特定列的输出

如果我们只关心两个文件中共有的行,可以使用 -12 选项:

comm -12 file1.txt file2.txt

输出结果

banana
cherry

如果我们只关心 file1.txt 中独有的行,可以使用 -23 选项:

comm -23 file1.txt file2.txt

输出结果

apple

同样地,如果我们只关心 file2.txt 中独有的行,可以使用 -13 选项:

comm -13 file1.txt file2.txt

输出结果

date

注意事项

  1. 文件必须已排序comm 假设输入文件是按字典顺序排序的。如果文件未排序,可能会导致错误的输出。
  2. 空白字符comm 对空白字符敏感。如果两行之间有额外的空格或制表符,它们可能被视为不同的行。

相关扩展知识

  • diff 命令:与 comm 类似,diff 也可以比较两个文件的不同之处,但它不要求文件已排序,并且可以提供更详细的差异信息。
  • grep 命令:可以通过 grep 来查找一个文件中是否包含另一个文件中的内容。
  • sort 命令:用于对文件内容进行排序,是 comm 的必要前置步骤。