当前位置: 首页 > news >正文

Linux comm 命令超详细教程|文件对比 / 交集 / 差集一站式搞定

Linux 学习资料 https://pan.baidu.com/s/1A6qqBk2ViE_Le2cQjSowkQ?pwd=7uz8

1. 命令简介

comm 命令用于逐行比较两个已排序的文件,并按照预设的列格式输出比较结果。它默认输出三列,分别显示:

仅出现在第一个文件中的行 仅出现在第二个文件中的行 两个文件中共同存在的行

该命令是 GNU coreutils 工具集的一部分,常用于文本处理、数据对比和集合运算(如求交集、差集)。


2. 语法格式

bash

运行

comm [OPTION]... FILE1 FILE2
  • FILE1, FILE2要比较的两个文件。如果某个文件为 -,则表示从标准输入(stdin)读取数据。
  • OPTION可选参数,用于控制输出格式和比较行为。

3. 常用选项及说明

表格

选项说明
-1不输出第一列(仅 FILE1 中存在的行)。
-2不输出第二列(仅 FILE2 中存在的行)。
-3不输出第三列(两个文件共有的行)。
--check-order严格检查输入行是否已正确排序,如果未排序则报错退出。
--nocheck-order不检查输入行的排序(默认行为)。即使文件未排序,也继续比较。
--output-delimiter=STR使用指定字符串 STR 作为列之间的分隔符,代替默认的制表符(TAB)。
--total额外增加一个第四列,显示每一行的类别统计总数。
-z, --zero-terminated将行终止符设置为 NUL(空字符,\0),而不是默认的换行符(\n)。
--help显示帮助信息并退出。
--version显示版本信息并退出。

返回值:

  • 0:成功执行。
  • 非 0:执行过程中出现错误(如文件无法打开、排序检查失败等)。

4. 示例用法

示例文件准备

假设有两个文本文件:

aaa.txt 内容:

plaintext

aaa bbb ccc ddd eee 111 222

bbb.txt 内容:

plaintext

bbb ccc aaa hhh ttt jjj

4.1 基本比较(默认输出三列)

bash

运行

comm --nocheck-order aaa.txt bbb.txt

输出:

plaintext

aaa bbb ccc ddd eee 111 222 hhh ttt jjj

说明:

  • 第一列(无前导空白):仅 aaa.txt 中有的行(aaa, ddd, eee, 111, 222)。
  • 第二列(一个制表符缩进):仅 bbb.txt 中有的行(aaa, hhh, ttt, jjj)。
  • 第三列(两个制表符缩进):两个文件共有的行(bbb, ccc)。

注意:此例文件未排序,结果可能混乱,强调了排序的重要性。

4.2 比较已排序的文件

由于 comm 要求输入文件已按字典序排序,通常需要先使用 sort 命令处理:

bash

运行

sort aaa.txt > aaa_sorted.txt sort bbb.txt > bbb_sorted.txt comm aaa_sorted.txt bbb_sorted.txt

输出将更加清晰,相同内容会正确对齐。

4.3 求两个文件的交集(共同行)

隐藏第一列和第二列,只显示共有的行:

bash

运行

comm aaa_sorted.txt bbb_sorted.txt -1 -2

输出:

plaintext

bbb ccc

4.4 求差集

仅显示在 aaa.txt 中但不在 bbb.txt 中的行:

bash

运行

comm aaa_sorted.txt bbb_sorted.txt -2 -3

输出:

plaintext

111 222 aaa ddd eee

仅显示在 bbb.txt 中但不在 aaa.txt 中的行:

bash

运行

comm aaa_sorted.txt bbb_sorted.txt -1 -3

输出:

plaintext

hhh jjj ttt

4.5 使用自定义列分隔符

将默认的制表符分隔改为竖线 |:

bash

运行

comm --output-delimiter=' | ' aaa_sorted.txt bbb_sorted.txt

输出列之间将以 | 分隔,提高可读性。

4.6 处理以 NUL 分隔的输入(如 find 输出)

与 find 命令结合,比较两个目录中的文件名列表:

bash

运行

find dir1 -type f -print0 | sort -z > list1.txt find dir2 -type f -print0 | sort -z > list2.txt comm -z list1.txt list2.txt

-z 选项确保正确处理包含换行符的文件名。


5. 注意事项

  • 输入必须排序: comm 命令的核心前提是两个输入文件必须已按字典序排序。如果文件未排序,比较结果将不可预测。建议始终先使用 sort 命令排序,或使用 --nocheck-order 跳过检查(但结果可能不准)。
  • 列的顺序固定: 输出列的顺序是固定的:第一列 = 仅 FILE1,第二列 = 仅 FILE2,第三列 = 共有。通过 -1、-2、-3 选项可以隐藏对应列。
  • 默认分隔符为 TAB: 默认情况下,列之间以一个制表符(TAB)分隔。可使用 --output-delimiter 自定义分隔符,这在需要进一步处理输出时很有用。
  • 与 diff 的区别: comm 用于比较已排序的文件,输出格式为并排列;diff 用于比较可能未排序的文件,输出格式为更改指令(如添加、删除、修改)。根据需求选择合适的工具。
  • 大文件处理: comm 使用基于行的比较算法,适合处理大型文本文件,但前提是内存足以容纳行数据。

获取更多帮助:

  • 查看手册页:man comm
  • 查看 info 文档:info coreutils 'comm invocation'
  • 显示内置帮助:comm --help

通过灵活组合选项,comm 可以高效完成文本集合运算,是 Shell 脚本中常用的数据对比工具。

http://www.cnnetsun.cn/news/3885140.html

相关文章:

  • 基于WorkBuddy AI Agent构建自动化日报生产线:从信息过载到高效内容创作
  • 告别“黑盒”与误判:如何用“多智能体对抗辩论”重构内容安全审核系统
  • 从Claude Code源码泄露看AI工程安全:Source Map配置与构建部署防御
  • 厦门网站建设php实战指南:从代码规范到性能优化的深度解析
  • MySQL binlog日志管理与安全删除实践指南
  • 从单模型到多模型编排:构建高效AI Agent系统的核心策略与实践
  • PostgreSQL 18集成PostGIS与pgvector的Docker部署指南
  • 海口市住房和城乡建设局网站:您不可不知的便民办事指南与房产资讯平台
  • 领导周三丢需求周五要汇报,我用 TRAE Work 把两天的活压到了 45 分钟
  • python-numpy库的使用
  • TVA-VLA架构:具身智能规模化落地关键支撑(5)
  • Unity多人策略游戏开发:基于Netcode for GameObjects的网络同步实战
  • 珠海网站建设哪家好?旭洁科技如何用真诚与专业打造企业品牌数字名片
  • Unity角色动画脚部IK五步实战:解决踩踏问题与环境适配
  • 从零用低代码平台制作数据大屏(智表 + AJ-Report 实战)
  • 金融图片合规审核系统实战:从架构设计到模型迭代的完整指南
  • 【Agent】Claude Code CLI 接入阿里 Token Plan 保姆级教程
  • AI Agent上下文管理:从OpenClaw痛点解析到Hermes动态分层策略实战
  • 【中科蓝讯】从两次偶发死机,理解 com 区和 bank 区
  • AI Agent邮件自动化实战:从语义理解到私有化部署的完整指南
  • C++游戏开发实战:从状态机到组件化架构的SFML项目构建
  • 20轮对话后它还记得第一句话吗?Kimi K3多轮对话连贯性与逻辑推理实测
  • Unity RuntimeInspector性能优化:从卡顿到流畅的架构与实战
  • Linux系统性能监控:TOP命令从入门到实战解析
  • 基于WebSocket与状态机的实时对话引擎OpenClaw设计与实现
  • 技术流:用开源模型+工作流,搭一条“方桃子式“AI数字人内容流水线(附Prompt)
  • dify实现rss新闻订阅
  • 数据集格式转化 xml转换txt xml转换txt 转换代码示例参考 VOC(xml)格式如何转换yolo(txt )格式 (1)
  • 面试Leetcode - Graph
  • 2026最新视频重点整理工具口碑推荐 | 经过筛选的实用选择建议