假设我们现在有两个文件 a.txt 、b.txt

a.txt 中的内容如下:

a
c
1
3
d
4

b.txt 中的内容如下:

a
b
e
2
1
5

# Example 01

计算并集:

[root@VM_81_181_centos ~]# sort -u a.txt b.txt
1
2
3
4
5
a
b
c
d
e
[root@VM_81_181_centos ~]#

# Exmaple 02

计算交集:

[root@VM_81_181_centos ~]# grep -F -f a.txt b.txt | sort | uniq
1
a
[root@VM_81_181_centos ~]#

# Example 03

计算差集(a - b):

[root@VM_81_181_centos ~]# grep -F -v -f b.txt a.txt | sort | uniq
3
4
c
d
[root@VM_81_181_centos ~]#

# Example 04

计算差集(b - a):

[root@VM_81_181_centos ~]# grep -F -v -f a.txt b.txt | sort | uniq
2
5
b
e
[root@VM_81_181_centos ~]#

-----------------------------------------------------------手动分割线---------------------------------------------------------------------------

2018/09/30 更新

上面介绍了关于如何使用 grep 命令实现文件的交、差集,但是在实际操作中得到的结果却有点问题存在

[root@VM_81_181_centos ~]# grep -F -f a.txt b.txt | sort | uniq | wc -l
4095
[root@VM_81_181_centos ~]# grep -F -f b.txt a.txt | sort | uniq | wc -l
4729
[root@VM_81_181_centos ~]#

上面的命令我是用于求 a 、b 两个文件的交集,但是当把两个文件的位置顺序改变了一下,结果竟然是不

一样,这是不科学的。

后来仔细想了想,grep 命令是搜索查找的命令,举个例子:

c.txt 文件里面的内容如下:

1122
1133
1144
1155

d.txt 文件里面的内容如下:

11223344

执行 grep 命令:

[root@VM_81_181_centos ~]# grep -F -f c.txt d.txt | sort | uniq
11223344
[root@VM_81_181_centos ~]# grep -F -f d.txt c.txt | sort | uniq
[root@VM_81_181_centos ~]#

根据结果,对第一条命令的解读是:

命令执行后,在 d.txt 文件里面搜索和 c.txt 文件相匹配的字符,因为 c.txt 文件里面的字符 1122 和 d.txt 文件里面的

字符 11223344 前面的 1122 相匹配,则就把 11223344 字符作为两个文件相同的部分记录下来

第二条命令:

命令执行后,在 c.txt 文件里面搜索和 d.txt 文件相匹配的字符,d.txt 文件里面的 11223344 在 c.txt 文件里面找不到

与其类似或相同的字符,所以,结果为空。

现在,在 c.txt 文件里面新增字符 112233445566,结果及操作如下:

c.txt 文件内容:

1122
1133
1144
1155
1122334455

执行  grep 命令:

[root@VM_81_181_centos ~]# grep -F -f d.txt c.txt | sort | uniq
1122334455
[root@VM_81_181_centos ~]#

结论:

grep -F -f fileA fileB | sort | uniq

当 fileA 文件 在前,则表示在 fileB  文件里面搜索和 fileA 文件里面相同或者类似的字符,并将 fileB 文件里面那个字符记录下来

同理,fileB 在前,fileA 在后的情况。

但是,在这里这并不是我们想要的结果,我们想要的结果就是我们以前学数学时候,求两个集合的交集一样,结果输

出的是两个集合共有的部分,尝试了几个方法,最后还是选择使用 cat 命令。

命令格式如下:

cat fileA fileB | sort | uniq -d  # 求交集
cat fileA fileB | sort | uniq -u # 求差集

这个命令比较好理解,cat 命令先把两个文件合并成一个文件,然后在对合并后的文件进行排序、去重,-d 命令输出文

件中相同的字符,-u 命令输出文件中不同的字符,并且 在计算交集的时候 fileA、fileB 文件顺序哪个在前在后的结果都是一样的。

案例如下:

[root@VM_81_181_centos ~]# cat c.txt
1122
1133
1144
1155
1122334455
[root@VM_81_181_centos ~]# cat d.txt
11223344
1122
[root@VM_81_181_centos ~]#

c、d 文件内容如上

执行 cat 命令求交集:

[root@VM_81_181_centos ~]# cat c.txt d.txt | sort | uniq -d
1122
[root@VM_81_181_centos ~]# cat d.txt c.txt | sort | uniq -d
1122
[root@VM_81_181_centos ~]#

执行 cat 命令求差集:

[root@VM_81_181_centos ~]# cat c.txt d.txt | sort | uniq -u
11223344
1122334455
1133
1144
1155
[root@VM_81_181_centos ~]# cat d.txt c.txt | sort | uniq -u
11223344
1122334455
1133
1144
1155
[root@VM_81_181_centos ~]#

但是 cat 命令也有一个短板,当文件比较大的时候,就会出错,但是在这里我们可以去借助

split 命令对文件进行分割,分而治之,然后合并,关于如何使用 split 命令,可以参考我的这篇文章

传送门:https://www.cnblogs.com/leeyongbard/p/9594439.html

----------------------------------------------2019/04/27------------------------------------------------------------

paste命令

按列合并文件

paste 格式为:

paste -d -s -file1 file2

选项含义如下:

-d 指定不同于空格或tab键的分隔符,例如使用@分隔符,使用 -d @

-s 将每个文件合并成行而不是按行粘贴

- 使用标准输入。例如:ls -l | paste 意思是只在一列上显示输出

例子:

#cat pas1
ID897
ID666
ID982
#cat pas2
P.Jones
S.Round
L.Clip

基于 paste 命令将 pas1.txt 和 pas2.txt 两文件粘贴成两列:

# paste pas1 pas2
ID897 P.Jones
ID666 S.Round
ID982 L.Clip

通过交换文件名即可指定哪一列先粘贴:

# paste pas2 pas1
P.Jones ID897
S.Round ID666
L.Clip ID982

要创建不同于空格或tab键的分隔符,使用 -d 选项,如下使用冒号做分隔符:

# paste -d: pas2 pas1
P.Jones:ID897
S.Round:ID666
L.Clip:ID982

要将两列合并成两行,需要使用 -s 选项,如下例子:

# paste -s pas1 pas2
ID897 ID666 ID982
P.Jones S.Round L.Clip

有不同意见,欢迎交流^_^

Linux shell 计算两个文件的并集、交集、差集的更多相关文章

  1. [Linux] 取两个文件的并集/交集/差集

    uniq -d是只打印重复行 -u是只打印独一无二的行文件A : abcd文件B: cdef取并集:A + B sort A B|uniq 取交集: sort A B|uniq -d 取差集:A - ...

  2. linux 处理两个文件的并集,交集,计数

    1. 取出两个文件的并集(重复的行只保留一份) cat file1 file2 | sort | uniq 2. 取出两个文件的交集(只留下同时存在于两个文件中的文件) cat file1 file2 ...

  3. python求两个列表的并集.交集.差集

    求两个列表的差集 >>> a = [1,2,3] >>> b=[1,2] >>> ################################ ...

  4. C#计算两个文件的相对目录算法

    C#计算两个文件的相对目录算法 楼主大菜鸟一只,第一次写技术博客,如果有概念错误或代码不规范的地方,还请各位多多批评指正.话不多说,来看题: 前一阵子开发了一个用户控件,里面调用了很多css,js等资 ...

  5. php 计算两个文件的相对路径

    <?php /** * 计算两个文件的相对路径 */ function relative_path($path1, $path2) { $arr1 = explode('/', dirname( ...

  6. Shell合并两个文件成一个文件的两列paste,awk

    Shell合并两个文件成一个文件的两列 发布时间:2014-07-20   编辑:www.jquerycn.cn Shell合并两个文件成一个文件的两列,提供了两种方法,普通shell脚本,awk脚本 ...

  7. PHP计算两个时间段是否有交集(边界重叠不算)

    优化前的版本: /** * PHP计算两个时间段是否有交集(边界重叠不算) * * @param string $beginTime1 开始时间1 * @param string $endTime1 ...

  8. Linux下对比两个文件夹的方法

    最近拿到一份源代码,要命的是这份源代码是浅克隆模式的git包,所以无法完整显示里面的修改的内容. 今天花了一点点时间,找了一个在Linux对比两个文件夹的方法. 其实方法很简单,用meld 去对比两个 ...

  9. php源码之计算两个文件的相对路径

    <?php //计算出两个文件的相对路径即path2相对于$path1的相对路径 // http://www.manongjc.com/article/1342.html function ge ...

随机推荐

  1. JAVA 中的 Collection 和 Map 以及相关派生类的概念

    JAVA中Collection接口和Map接口的主要实现类   Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的 ...

  2. c# 图像呈现控件PictureBox

    在c#中可以使用PictureBox控件来呈现图像,图像资源可以来自文件,也可以是存在内存中的位图对象.可以显示本地图像文件或来自网络的图片,也可以来自项目文件中的图像. 从URI加载图像文件. 调用 ...

  3. WebSocket和long poll、ajax轮询的区别,ws协议测试

    WebSocket和long poll.ajax轮询的区别,ws协议测试 WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连 ...

  4. win10 常用设置 桌面出来计算机图标,固定桌面摆好的图标设置方法,电脑设备ID方法

    win10 常用设置 桌面出来计算机图标,固定桌面摆好的图标设置方法 桌面右键-->显示设置-->桌面图标设置 电脑设备ID:xxx查看方法:桌面右键-->显示设置-->关于

  5. oracle函数,游标,视图使用总结

    oracle函数或者叫存储过程,在实际的开发过程中对于复杂的业务需求是非常有用的,非常有效率的也是非常好玩儿的一个技术点. 平常在开发过程中对于CRUD功能较多.一般SQL即可应付,大不了就是长一点而 ...

  6. [转载]asp.net中,<%#%>,<%=%>和<%%>分别是什么意思,有什么区别

    在asp.net中经常出现包含这种形式<%%>的html代码,总的来说包含下面这样几种格式: 一. <%%> 这种格式实际上就是和asp的用法一样的,只是asp中里面是vbsc ...

  7. java之定时任务

    package com.financial.server.util; import java.text.SimpleDateFormat; import java.util.Date; import ...

  8. Java 高级开发必修知识---内部类

    摘自:http://www.cnblogs.com/lsy131479/p/8798912.html Java 内部类分为: 1)成员内部类 2)静态嵌套类 3)方法内部类 4)匿名内部类 内部类的共 ...

  9. hashcat使用命令简介

    1.指定HASH类型 在HashCat中--hash-type ?参数可以指定要破解的HASH类型,运行hashcat主程序加上--help参数,在* Generic hash types:中可以看到 ...

  10. 管理mycat命令详解

    mycat监听两个端口,分别为8066和9066:mycat服务默认的数据端口是8066,而9066端口则是mycat管理端口,用于管理mycat的整个集群状态.监听的端口可以在server.xml配 ...