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

Linux系统比较两个​​已排序文件​​的实用工具之comm

目录

1. 🖥️ 基本语法与输出说明

2. 🔍 常用选项组合与实战场景

3. ⚙️ 处理未排序文件与自定义格式

4. 🤔 常见问题与技巧

5. 💡 综合实战案例

5.1 分析日志变化​​:

5.2 快速比较目录内容​​:

5.3 检查配置变更​​:

6. 💎 总结


comm 命令是 Linux 中用于比较两个​已排序文件​的实用工具,它能清晰展示文件间的差异共同内容。下面通过一些典型场景和示例来帮助你掌握它的用法。

1. 🖥️ 基本语法与输出说明

comm 命令的基本语法如下:

comm [OPTION]... FILE1 FILE2

​默认情况下​​,comm 会生成​​三列输出​​:

  • ∙​​第一列​​:仅存在于 FILE1 中的行。
  • ∙​​第二列​​:仅存在于 FILE2 中的行。
  • ∙​​第三列​​:两个文件共有的行。
  •  列之间默认以​​制表符(\t)​​ 分隔

假设你有两个已排序的文件:

[root@centos79-20251123 ~]# cat   file1.txt
apple
banana
cherry
[root@centos79-20251123 ~]# cat   file2.txt
banana
date
elderberry

直接比较它们:

comm file1.txt file2.txt

输出结果会是:

[root@centos79-20251123 ~]# comm   file1.txt   file2.txt
applebanana
cherrydateelderberry

注意:第二列(仅 file2 有)的内容在输出中会有一个前导的制表符,第三列(共有)则有两个前导的表符,这使得视觉上各列是错开的。

2. 🔍 常用选项组合与实战场景

通过组合 -1-2-3 选项,可以灵活筛选需要的内容。

选项组合作用命令示例上文示例中的结果
-23​仅显示第一个文件独有的行​comm -23 file1.txt file2.txtapplecherry
-13​仅显示第二个文件独有的行​comm -13 file1.txt file2.txtdateelderberry
-12​仅显示两个文件共有的行​comm -12 file1.txt file2.txtbanana

这些选项可以单独或组合使用,例如 -2 会抑制第二列(仅FILE2存在)的显示。

3. ⚙️ 处理未排序文件与自定义格式

​重要前提​​:comm 命令要求输入文件必须是​已排序的​​(通常按字母顺序)。如果文件未排序,直接比较会得到错误结果,甚至报错:comm: file 1 is not in sorted order

处理未排序文件的方法是先用 sort 命令排序。你可以排序后保存为新文件再比较:

sort unsorted1.txt > sorted1.txt
sort unsorted2.txt > sorted2.txt
comm sorted1.txt sorted2.txt

或者使用​​进程替换​​(Process Substitution)直接比较:

comm <(sort unsorted1.txt) <(sort unsorted2.txt)

你可以用 --output-delimiter 选项改变默认的列分隔符,例如使用逗号:

comm --output-delimiter="," file1.txt file2.txt

输出会变为:

apple,,banana
cherry,date,elderberry

请注意,​​分隔符会替换原有的制表符对齐方式​​,可能使列不再对齐,但内容对应关系不变。

4. 🤔 常见问题与技巧

  • ∙​​报错“文件未排序”​​:这表示输入文件未按要求排序。请务必先用 sort 命令处理文件。
  • ∙​​忽略大小写比较​​:comm 默认​​区分大小写​​。若需忽略,可先统一大小写再排序比较:
comm <(tr '[:upper:]' '[:lower:]' < file1.txt | sort) <(tr '[:upper:]' '[:lower:]' < file2.txt | sort)
  • ∙​​与 diffgrep 的区别​​:
    命令特点适用场景
    comm三列输出,需预排序精确行级比较,区分“A独有、B独有、共同”
    diff显示差异内容,支持未排序文件变更详情分析,查看差异上下文
    grep -f模式匹配,无需排序快速查找一个文件中的行是否存在于另一个文件

5. 💡 综合实战案例

5.1 分析日志变化​​:

提取两天日志中的独立 IP,找出第二天新增的 IP

# 提取day1的独立IP并排序
grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' day1.log | sort -u > day1_ips.txt
# 提取day2的独立IP并排序
grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' day2.log | sort -u > day2_ips.txt
# 找出只在day2中出现的IP
comm -13 day1_ips.txt day2_ips.txt > new_ips.txt
5.2 快速比较目录内容​​:

比较两个目录中(去除路径后)文件名异同

# 获取dir1的文件名列表并排序
ls dir1 | sort > dir1_files.txt
# 获取dir2的文件名列表并排序
ls dir2 | sort > dir2_files.txt
# 找出两个目录中都存在的文件
comm -12 dir1_files.txt dir2_files.txt
5.3 检查配置变更​​:

动态比较当前配置与备份配置的差异。

comm -3 <(sort current.config) <(sort backup.config)

6. 💎 总结

comm 命令在需要​​精确比对两个已排序数据集​​的差异项,并明确区分“A独有、B独有、共同拥有”三类结果时特别有用。记住它的​​两个关键点​​:一是输入文件必须预先排序,二是灵活运用 -1-2-3 选项组合来过滤输出。

http://www.xdnf.cn/news/1410481.html

相关文章:

  • 混合润滑表面接触刚度和接触阻尼模型
  • 计算机视觉与深度学习 | 低照度图像处理算法综述:发展、技术与趋势
  • ESP32_实验12_基于光敏传感器的停车场车辆计数系统
  • LeetCode 1855.下标对中的最大距离
  • 基于Python的OCR文字识别系统
  • More Effective C++ 条款19:理解临时对象的来源(Understand the Origin of Temporary Objects)
  • 地信/测绘/遥感就业岗位合集
  • Vue2 与 Vue3 路由钩子的区别及用法详解
  • 事件驱动架构新范式:FastEvent 让领域事件开发变得优雅
  • UVM APB 验证 VIP Agent 逻辑架构与数据流图
  • audioLDM模型代码阅读(三)——变分自编码器VAE
  • LeetCode100-160相交链表【链表介绍】
  • 基于AI的大模型在S2B2C商城小程序中的应用与定价策略自我评估
  • USBX移植(X是eXtended的意思)
  • 【python]变量及简单数据类型
  • Spring Data JPA 派生查询方法命名速查表
  • 平滑滤波器(Smooth Filter)的MATLAB与Verilog仿真设计与实现
  • linux内核trace_begin和trace_end使用分析
  • ICode总线原理
  • 【Bluedroid】A2DP Source 音频传输停止流程及资源管理机制(btif_a2dp_source_stop_audio_req)
  • ESP32学习笔记_Peripherals(5)——SPI主机通信
  • 编写一个名为 tfgets 的 fgets 函数版本
  • FPGA入门指南:从零开始的可编程逻辑世界探索
  • deep seek的对话记录如何导出
  • 【大数据技术实战】流式计算 Flink~生产错误实战解析
  • Springcloud-----Nacos
  • 【Spring Cloud微服务】7.拆解分布式事务与CAP理论:从理论到实践,打造数据一致性堡垒
  • Java试题-选择题(25)
  • 【Java进阶】Java与SpringBoot线程池深度优化指南
  • 【计算机组成原理·信息】2数据②