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. 线段树区间更新+区间求和模板(数组实现)洛谷p3372,p3373

    模板题目1:https://www.luogu.org/problemnew/show/P3372 懒惰标记讲解:https://www.cnblogs.com/wushengyang/p/11194 ...

  2. mac上mamp用navigate连接不上

    参考 http://blog.sina.com.cn/s/blog_6742643c0100r9qp.html

  3. textarea高度自动增高

    <!--随着textarea 输入内容 自动增加高度--> <script type="text/javascript"> $(".input_t ...

  4. JS---案例:高清放大镜

    案例:高清放大镜 分3步 1. 鼠标进入和离开,显示和隐藏遮挡层和大图div 2. 鼠标在小层上移动,鼠标横纵坐标,为可视区域坐标-遮挡层的宽高,鼠标移动的时候,在一个区域内移动,需要判断和定义下移动 ...

  5. 项目中的那些事---下载pdf文件

    最近做了一个下载pdf文档的需求,本以为使用HTML5中<a>标签的属性download就能简单搞定,不料IE竟然不支持这一简单粗暴的H5新特性,而是直接在网页中打开, 于是各种搜索之后得 ...

  6. 007-使用python统计代码行数,空行以及注释

    # 自己写过的程序,统计一下你写过多少行代码.包括空行和注释,但是要分别列出来 1.打开文件方法 1.1 以读文件的模式打开一个文件对象,使用Python内置的open()函数,传入文件名和标示符 f ...

  7. python实例 条件和循环语句

    #! /usr/bin/python #条件和循环语句 x=int(input("Please enter an integer:")) if x<0:     x=0    ...

  8. 【CodeVS】2822 爱在心中 [2017年6月计划 强连通分量03]

    2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond         题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够 ...

  9. Vue2.0史上最全入坑教程(下)—— 实战案例

    书接上文 前言:经过前两节的学习,我们已经可以创建一个vue工程了.下面我们将一起来学习制作一个简单的实战案例. 说明:默认我们已经用vue-cli(vue脚手架或称前端自动化构建工具)创建好项目了 ...

  10. 你知道forEach和each的区别吗?

      要知道forEach和each的区别,你必须明白一点:forEach是js中的方法(针对数组),而each是jquery中的方法(针对jquery对象,即$( ) ).知道这一点,接下来我分别给举 ...