两个文件比较之comm命令

comm命令可用于两个文件之间的比较。它有很多不错的选项可用来调整输出,以便我们执
行交集、求差(difference)以及差集操作。
? 交集:打印出两个文件所共有的行。
? 求差:打印出指定文件所包含的且互不相同的那些行。
? 差集:打印出包含在文件a中,但不包含在其他指定文件中的那些行。

假设现在有两个文件a和b,内容分别是:a(1,2,3),b(3,4,5)。那么,对这两个文件进行操作的结果如下。
交集:3。
求差:1,2,4,5。
差集(a):1,2。

需要注意的是comm必须使用排过序的文件作为输入。请看看下面的例子:

[[email protected] shell]# echo -e "1\n3\n8\n2" > a.txt
[[email protected] shell]# cat a.txt
1
3
8
2
[[email protected] shell]# echo -e "1\n5\n7\n2" > b.txt
[[email protected] shell]# cat b.txt
1
5
7
2
[[email protected] shell]# sort a.txt  -o a.txt ; sort b.txt -o b.txt

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

[[email protected] shell]# comm a.txt b.txt
        1
        2
3
    5
    7
8

输出的第一列包含只在a.txt中出现的行(a的差集),第二列包含只在b.txt中出现的行(b的差集),第三列
包含a.txt和b.txt中相同的行(交集)。各列以制表符(\t)作为定界符。

(2) 为了打印两个文件的交集,我们需要删除第一列和第二列,只打印出第三列:

[[email protected] shell]# comm -1 -2 a.txt b.txt
1
2

(3) 打印出两个文件中不相同的行:

[[email protected] shell]# comm -3 a.txt b.txt
3
    5
    7
8

在这次的输出中,那些唯一出现的行使得列中出现了空白字段。所以这两列在同一
行上不会同时都出现内容。为了提高输出结果的可用性,需要删除空白字段,将两
列合并成一列:

3
5
7
8

(4) 要生成规范的输出,得使用下面的命令:

[[email protected] shell]# comm -3 a.txt b.txt | sed ‘s/^\t//‘
3
5
7
8

(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 删除第一列和第三列。

工作原理:

comm的命令行选项可以按照需求对输出进行格式化,例如:
? -1 从输出中删除第一列;
? -2 从输出中删除第二列;
? -3 从输出中删除第三列。
  在生成统一输出时,sed命令通过管道获取comm的输出。它删除行首的 \t字符。sed中的s
表示替换(substitute)。/^\t/ 匹配行前的 \t(^是行首标记)。//(两个/操作符之间没有任何
字符)是用来替换行首的\t的字符串。如此一来,就删除了所有行首的\t。
  差集操作允许你比较两个文件,打印出只在a.txt或b.txt中出现的行。当a.txt和b.txt作为comm
命令的参数时,输出中的第一列是a.txt相对于b.txt的差集,第二列是b.txt相对于a.txt的差集。

时间: 2024-08-10 00:06:23

两个文件比较之comm命令的相关文章

比较两个排序好的文件的方法—— comm

导读 Linux 中的 comm 命令可以让用户按行比较两个已经排序好的文件.在本教程中,我们将使用一些浅显易懂的例子来讨论这个命令行工具.在开始之前,请注意,本教程中提到的所有例子都已经在 Ubuntu 16.04LTS 版本中测试过.. 下面的例子将会告诉你 comm 命令是如何工作的.. 如何使用 comm比较两个排序好的文件 要使用comm 命令比较两个排序好的文件,只需要把它们的名字作为comm 命令的参数.下面是通常的语法: comm [name-of-first-file] [na

Linux comm命令求出文件的交集、差集

A(1,2,3)和B(3,4,5),A和B的交集是3,A对B的差集是1和2,B对A的差集是4和5,A和B求差的结果是1.2.4.5. 在Linux中可以使用comm命令求出这些集. [[email protected] tmp]# cat <<eof>set1.txt > orange > gold > apple > sliver > steel > iron > eof [[email protected] tmp]# cat <<

第二十二章 Linux文件比较,文本文件的交集、差集与求差:comm命令

第二十二章 Linux文件比较,文本文件的交集.差集与求差:comm命令 名词解释 comm 命令 可以用于两个文件之间的比较,它有一些选项可以用来调整输出,以便执行交集.求差.差集操作. 交集:打印两个文件所共有的行 求差:打印出指定文件所包含的其不相同的行. 差集:打印出包含在一个文件中,但不包含在其他指定文件中的行. 语法 comm(选项)(参数) 选项 -1 :不显示在第一个文件出现的内容: -2 :不显示在第二个文件中出现的内容: -3 :不显示同时在两个文件中都出现的内容. ? 参数

linux命令 比较两个文件

1.cmp命令 通过比较字节比较文件 例: 设置两个不同的文件,通过cmp命令来执行 在屏幕上会显示第几行不同 2.diff 一行一行的比较两个文件 如: 会溴铵是具体哪些行不同 3.vimdiff 会在屏幕上显示两个窗口来显示不同之处 总结: 一般推荐使用diff命令,可显示在哪行两文件不同,如果需要具体知道不同之处,可使用vimdiff,具体查看不同 原文地址:https://www.cnblogs.com/alighie/p/8671978.html

两个文件去重的N种姿势

最近利用shell帮公司优化挖掘关键词的流程,用shell替代了多个环节的操作,极大提高了工作效率. shell在文本处理上确有极大优势,比如多文本合并.去重等,但是最近遇到了一个难搞的问题,即两个大数据量文件去重. 有txt文件A.txt和B.txt. 其中A为关键词和搜索量,以逗号分隔,约90万行. B为关键词,约400万行. 需要从A中找出与B重复的关键词. 我试了N种姿势,但结果都不尽人意,最奇怪的是有些方法对小数据量的测试文件有用,一旦用在A与B上就会失败,真叫人百思不得其解. 姿势一

两个文件内容差异对比,

比较两个单行文件的方法就我知道的而言有4种 用diff 用grep 用comm 用uniq [[email protected] ~]# echo "`seq 5`" >file1;cat file1 1 2 3 4 5 [[email protected] ~]# echo "`seq 2 7`" >file2;cat file2 2 3 4 5 6 7 1.用diff -c file1多的是"-"file2多的是"+&q

linux比较两个文件的不同(6/21)

cmp 命令:比较任意两个类型的文件,且吧结果输出到标准输出,默认文件相同不输出,不同的文件输出差异 必要参数 -c 显示不同的信息-l 列出所有的不同信息-s 错误信息不提示 选择参数 -i<字符数> 指定字符数目-v 显示版本信息--help 显示帮助信息 [函数的返回值] 0 :文件时同样的1 :文件是不同的>1:发生错误 comm将逐行比较已经排序的两个文件.显示结果包括3列: 第1列为只在file1中找到的行;第2列为只在file2中找到的行;第3列为两个文件的公用行. 参数

mac 比较两个文件

比较两个文件,输出两个文件都有的行,可以使用comm命令,如下例: ------------------->$ cat 1s1.txt line 0 line 1 line 1 line 2 line 3 line 4 ------------------->$ cat 1s2.txt line 1 line 3 line 3 line 6 ------------------->$ comm 1s1.txt 1s2.txt line 0 line 1 line 1 line 2 lin

两个文件diff:交集差集并集

comm comm -12 <(sort 123|uniq) <(sort 234 | uniq) | wc -l [comm -12 表示取消第一列和第二列的输出,即只输出第三列] comm命令可以求两个文件的比较结果.默认输出三列,分别表示A-B,B-A 和 A交B. comm命令要求输入文件的内容必须是排序且唯一的 https://www.xuebuyuan.com/1273561.html grep 交集:grep -F -f file1 file2 B-A:grep -F -v -f