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. Leetcode131. Palindrome Partitioning分割回文串

    给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入: "aab" 输出: [ ["aa",&quo ...

  2. 前端js错误日志收集

    今天一个客户说他们的一个同事用OPPO R11的手机访问不了我们的项目,打开后一片空白,虽然后面发现你的手机网络断了,但是想起来毕竟手机端没有调试的工具可以查看抛出的错误信息,方便我们追踪问题,后端的 ...

  3. thinkphp用swiftmailer发邮件demo

    QQ邮箱 include_once APPPATH . 'libraries/swiftmailer/swift_required.php'; $transport = Swift_SmtpTrans ...

  4. JavaScript中[]+[] 、[]+{}、{}+[]、{}+{}的结果分析

    看到这样一个问题:{} + [] 的结果是多少? 一脸懵逼.. 于是在chrome控制台运行 {} + [] 和用 console.log({} + []) 输出,发现结果不一样.. 于是,把各种可能 ...

  5. mybatis深入理解(八)-----关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  6. LintCode_41 最大子数组

    题目 给定一个整数数组,找到一个具有最大和的子数组,返回其最大和. 注意事项 子数组最少包含一个数 样例 给出数组[−2,2,−3,4,−1,2,1,−5,3],符合要求的子数组为[4,−1,2,1] ...

  7. MultipartHttpServletRequest multiRequest = (MultipartHttpServletRequest) request; // 转换成多部分request异常

    原来是需要在springmvc中配置 <!-- multipartResolver上传文件 --> <bean id="multipartResolver" cl ...

  8. 想真正了解JAVA设计模式看着一篇就够了。 详解+代码实例

    Java 设计模式   设计模式是对大家实际工作中写的各种代码进行高层次抽象的总结 设计模式分为 23 种经典的模式,根据用途我们又可以分为三大类.分别是创建型模式.结构型模式和行为型模式 列举几种设 ...

  9. 学习JDK1.8集合源码之--HashMap

    1. HashMap简介 HashMap是一种key-value结构存储数据的集合,是map集合的经典哈希实现. HashMap允许存储null键和null值,但null键最多只能有一个(HashSe ...

  10. Django 的学习(1) 从建立到数据库操作

    基本是翻译官方教程 django-admin startproject mysite 创建工程的命令 来看一下django的结构图 manage.py 和工程交互的多种方式 inner mysilte ...