1.预备知识

comm命令可用于比较两个已排序的文件。它可以显示出第一个文件和第二个文件所独有的行以及这两个文件所共有的行。该命令有一些选项可以禁止显示指定的列,以便于执行交集和求差操作。

  • 交集(intersection):打印出两个文件所共有的行。
  • 求差(difference):打印出指定文件中所包含的互不相同的那些行。
  • 差集(set difference)①:打印出包含在文件A中,但不包含在其他指定文件(例如B和C)中的那些行。

2. 实战演练

需要注意的是comm必须使用两个排过序的文件作为输入。下面是我们用到的输入文件:

$ cat A.txt
apple
orange
gold
silver
steel
iron $ cat B.txt
orange
gold
cookies
carrot

$ sort A.txt -o A.txt ; sort B.txt -o B.txt

(1) 首先执行不带任何选项的comm:

$ comm A.txt B.txt
apple
carrot
cookies
gold
iron
orange
silver
steel

输出的第一列包含只在A.txt中出现的行,第二列包含只在B.txt中出现的行,第三列包含A.txt和B.txt中共有的行。各列之间以制表符(\t)作为分隔符。

(2) 为了打印两个文件的交集,我们需要删除前两列,只打印出第三列。-1选项可以删除第一列,-2选项可以删除第二列,最后留下的就是第三列:

$ comm A.txt B.txt - -
gold
orange

(3) 删除第三列,就可以打印出两个文件中互不相同的那些行:

$ comm A.txt B.txt -
apple
carrot
cookies
iron
silver
steel

输出中包含着夹杂有空白的两列,显示了在file1和file2中存在的唯一的行。要想提高输出结果的可用性,可以将两列合并成一列,就像这样:

apple
carrot
cookies
iron
silver
steel

(4) 可以使用tr删除制表符来合并两列:

$ comm A.txt B.txt - | tr -d '\t'
apple
carrot
cookies
iron
silver
steel

(5) 通过删除不需要的列,我们就可以分别得到A.txt和B.txt的差集。

A.txt的差集

$ comm A.txt B.txt -2 -3
-2 -3 删除第二列和第三列。

B.txt的差集
$ comm A.txt B.txt -1 -3
-1 -3 删除第一列和第三列。

3. 工作原理

comm的命令行选项可以减少输出。

  • -1:删除第一列。
  • -2:删除第二列。
  • -3:删除第三列。

差集操作允许你比较两个文件,去掉两个文件中共有的行,打印出只在A.txt或B.txt中出现的那些行。当A.txt和B.txt作为comm命令的参数时,输出中的第一列是A.txt相对于B.txt的差集,第二列是B.txt相对于A.txt的差集。

comm命令还接受字符-作为命令行参数,借此实现从stdin中读取输入。这就提供了一种比较多个文件的方法。

假设我们有一个文件C.txt:
$> cat C.txt
pear
orange
silver
mithral
我们可以将文件B.txt和C.txt与A.txt相比较:

$> sort B.txt C.txt | comm - A.txt
apple
carrot
cookies
gold
iron
mithral
orange
pear
silver
steel

shell学习(22)- comm的更多相关文章

  1. shell学习笔记

    shell学习笔记 .查看/etc/shells,看看有几个可用的Shell . 曾经用过的命令存在.bash_history中,但是~/.bash_history记录的是前一次登录前记录的所有指令, ...

  2. [转帖][Bash Shell] Shell学习笔记

    [Bash Shell] Shell学习笔记 http://www.cnblogs.com/maybe2030/p/5022595.html  阅读目录 编译型语言 解释型语言 5.1 作为可执行程序 ...

  3. Shell 学习(二)

    目录 Shell 学习(二) 1 设置环境变量 1.1 基本语法 1.2 实践 2 位置参数变量 2.1 介绍 2.2 基本语法 2.3 位置参数变量应用实例 3 预定义变量 3.1 基本介绍 3.2 ...

  4. shell学习记录002-知识点储备

    1.echo "4*0.33" |bc    #计算机功能的运用 [root@oc3408554812 shell]# ss=22; [root@oc3408554812 shel ...

  5. shell学习总结之自定义函数

    shell学习总结之自定义函数 Myfun (){ echo -n "now i is $i " ! [ "$i" ] && exit ; ec ...

  6. SHELL学习笔记----IF条件判断,判断条件

    SHELL学习笔记----IF条件判断,判断条件 前言: 无论什么编程语言都离不开条件判断.SHELL也不例外.  if list then           do something here   ...

  7. shell学习指南-阅读笔记

    shell学习指南真不是刚开始学习shell应该看得书,虽然其中讲了简单的linux命令,shell语法等,但是每章也有些深入和生僻地方,我想如果我刚学shell看到这样的地方一定会头疼的要死.或许也 ...

  8. 【转】shell学习笔记(一)——学习目的性、特殊字符、运算符等

    1 学习shell的目的性 写之前我们先来搞清楚为什么要学shell,学习要有目的性 shell简单.灵活.高效,特别适合处理一些系统管理方面的小问题 shell可以实现自动化管理,让系统管理员的工作 ...

  9. Shell学习之结合正则表达式与通配符的使用(五)

    Shell学习之结合正则表达式与通配符的使用 目录 通配符 正则表达式与通配符 通配符 通配符的使用 正则表达式 正则表达式 正则表达式的使用 通配符 正则表达式与通配符 正则表达式用来在文件中匹配符 ...

  10. Shell学习之条件测试(四)

    Shell学习之条件测试 目录 逻辑测试 文件测试 数值比较 字符串比较 逻辑测试 格式: [ 表达式 ] 操作符 [ 表达式2 ] …… 命令1 操作符 命令2 …… 常用的操作符 ( 注意:-a和 ...

随机推荐

  1. MyBatis配置文件(二)--settings配置

    settings是MyBatis中最复杂的配置,它能影响MyBatis底层的运行,大部分情况下使用默认值,只需要修改一些常用的规则即可.常用规则有自动映射.驼峰命名映射.级联规则.是否启动缓存.执行器 ...

  2. PAT甲级——A1039 Course List for Student

    Zhejiang University has 40000 students and provides 2500 courses. Now given the student name lists o ...

  3. Activiti实战01_认识Activiti

    什么是Activiti Activiti是为解决工作流而创建的一套流程引擎.举个最简单的例子,请假流程就是一个工作流,从开始到审批到结束,像流一样的贯穿整个流程.在工作中最常见的就是OA了.工作流总是 ...

  4. 数据库连接池 - (druid、c3p0、dbcp)

    概述: 在这里所谓的数据库连接是指通过网络协议与数据库服务之间建立的TCP连接.通常,与数据库服务进行通信的网络协议无需由应用程序本身实现. 原因有三: 实现复杂度大,需要充分理解和掌握相应的通信协议 ...

  5. [Day5] Nginx 变量

    一. Nginx中的变量原理 提供变量的模块和使用变量的模块 nginx启动,提供变量的模块会在一个回调函数中定义新的变量名和解析出变量的方法. 请求来了以后,使用变量的模块会根据变量名,去调用解析变 ...

  6. 再谈MFC学习——模态对话框的数据传递

    学习c++的目的就是为了使用封装好的类.而最最经典的封装类当然是微软的MFC窗体程序类. 学习MFC编程之前要学习c++的主要知识,掌握c++的基本编程思想. 以下就看下我学习的MFC模态对话框的数据 ...

  7. struts2-自定义拦截器-struts2标签

    1 自定义拦截器 1.1 架构 1.2 拦截器创建 创建方式1 创建方式2 创建方式3 ★★★★ 1.3 拦截器api 放行 前后处理 不放行,直接跳转到一个结果页面 不执行后续的拦截器以及Actio ...

  8. 2018-11-19-windows-应用程序在关机时的退出代号

    title author date CreateTime categories windows 应用程序在关机时的退出代号 lindexi 2018-11-19 14:31:38 +0800 2018 ...

  9. Qt运行不出现界面

    安装Qt之后按照例程运行,结果不出现界面,原因是路径中有中文,将中文全部改成英文之后,问题解决.

  10. CSS--去除除文本基线的几种方式

    削除文本基线的几种方式:1.display:block2.vertical-align:middle3.font-size:0px