假设我们现在有两个文件 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. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  2. 区块链3.0 ada Cardano卡尔达诺如何获得一致好评?

    区块链3.0 ada Cardano卡尔达诺如何获得一致好评? EOS 的直接竞争对手是以太坊.文章介绍的卡尔达诺(Cardano)的目标就更加远大了,他要同时锁定比特币和以太坊.但大家去网上搜索卡尔 ...

  3. java连接oracle数据库使用SERVICE NAME、SID以及TNSName不同写法

    格式一: 使用ServiceName方式: jdbc:oracle:thin:@//<host>:<port>/<service_name> 例 jdbc:orac ...

  4. SQL表分区之二

    前面说的给表做表分区,现在有个问题,比如上面我们说的是按照20w为一个分割线,那些现在我们想把这个调整下怎么办?难道要把之前的分区函数和分区方案删了,重新新建分区函数和分区方案嘛? 当然,此方式肯定是 ...

  5. sudo: apt-get: command not found

    apt-get是debian(Ubuntu)才有的包管理器,而在Apple 的OS X系统中是没有的. brew(全称Homebrew)是Mac OSX上的软件包管理工具,能在Mac中方便的安装软件或 ...

  6. flask框架----flask中的wtforms使用

    一.简单介绍flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装: pip3 install wtforms 二.简单使用wtfo ...

  7. Jquery 插件 图片验证码

    摘自:https://www.cnblogs.com/lusufei/p/7746465.html !(function(window, document) { var size = 5;//设置验证 ...

  8. 怎样从外网访问内网WebLogic?

    本地安装了一个WebLogic,只能在局域网内访问,怎样从外网也能访问到本地的WebLogic呢?本文将介绍具体的实现步骤. 准备工作 安装并启动WebLogic 默认安装的WebLogic端口是70 ...

  9. devexpress 之 ChartControl

    \}5#~mV#cr(/k1yIZ7.Lg

  10. 20145308 《网络对抗》 MAL_后门应用与实践 学习总结

    20145308 <网络对抗> MAL_后门应用与实践 学习总结 实践目的 使用nc实现win和Linux间的后门连接 meterpreter的应用 MSF POST的应用 知识点学习总结 ...