张芷铭的个人博客

comm

comm 是 Linux 和类 Unix 系统中一个用于逐行比较两个已排序文件的实用命令行工具。它能清晰地展示出两个文件之间的异同,是文本处理和数据分析中一个非常得力的助手。

🧠 核心概念:三列输出

理解 comm 命令的关键在于掌握其默认的三列输出格式

输出列对应含义
第1列仅在第一个文件中出现的行。
第2列仅在第二个文件中出现的行。
第3列在两个文件中都存在的行(交集)。

默认情况下,每一列之间以一个制表符(Tab)作为分隔,这使得输出结果在视觉上是对齐的。

⚙️ 基本语法与常用选项

命令的基本语法如下:

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

最常用的选项是 -1, -2, -3,它们分别用于抑制(不显示)对应的输出列。你可以灵活组合这些选项来获取你需要的信息:

选项组合命令示例输出结果
只显示交集comm -12 file1 file2两个文件共有的行。
只显示文件1的特有行comm -23 file1 file2仅在 file1 中出现的行。
只显示文件2的特有行comm -13 file1 file2仅在 file2 中出现的行。

🛠️ 实用操作示例

假设有两个已排序的文件 fruits_A.txtfruits_B.txt

  • fruits_A.txt 内容:
    Apple
    Banana
    Orange
    
  • fruits_B.txt 内容:
    Apple
    Grape
    Orange
    
  1. 默认比较(显示三列):

    1
    
    $ comm fruits_A.txt fruits_B.txt
    

    输出

            Apple
    Banana
            Grape
            Orange
    
    • 第1列(fruits_A.txt 特有):Banana
    • 第2列(fruits_B.txt 特有):Grape
    • 第3列(两者共有):Apple, Orange
  2. 找出两个购物清单的交集(共同想买的水果):

    1
    
    $ comm -12 fruits_A.txt fruits_B.txt
    

    输出

    Apple
    Orange
    
  3. 查看文件1的特有内容(A想买但B不想买的):

    1
    
    $ comm -23 fruits_A.txt fruits_B.txt
    

    输出

    Banana
    

⚠️ 重要前提与高级选项

文件必须预先排序

comm 命令的一个关键前提是,输入的两个文件必须事先按照相同的规则(通常是字典序)进行过排序。如果文件是乱序的,comm 的输出结果将是不可预测的。你可以使用 sort 命令来准备文件:

1
$ sort unsorted_file.txt > sorted_file.txt

为了安全起见,你可以使用 --check-order 选项让 comm 检查输入文件是否已排序。如果文件未排序,它会报错。如果确定要比较可能未排序的文件(并承担结果不准确的风险),可以使用 --nocheck-order

其他实用选项

  • --output-delimiter=str:允许你自定义输出列之间的分隔符,比如改为逗号 , 或其他字符,而不是默认的制表符。
  • -i:在比较时忽略字母大小写。
  • -z:使输入和输出的行分隔符从换行符变为空字符(ASCII NUL),这在处理包含特殊字符(如空格)的文件名时特别有用,可增强脚本的健壮性。

💎 总结

comm 是一款功能专一但非常强大的文本比较工具。它的威力建立在输入文件已正确排序的基础上。通过灵活使用 -1, -2, -3 选项,你可以轻松提取出文件的交集、差集,非常适合用于数据对比、脚本调试和日志分析等场景。

希望这些介绍能帮助你更好地理解和使用 comm 命令。

💬 评论