Linux下求差集运算方法小结

在实际的工作中我们经常会遇到求数据的差集的问题。比如,原来数据库的某个表中有1000条数据,后来经过一些后续的变更,变成了1200条数据了。那么我们如何求得这多出来的200条数据究竟是哪一些呢?在此,我做了一个小小的总结,把求解此类问题的方法在此列出。为了后面叙述的方便,现把原来的1000条数据的文件命名为file1.txt,后来的1200条数据的文件命名为file2.txt。file1.txt和file2.txt的数据格式完全一样,就是每行放一个字段。

方法一:利用sort和uniq命令

sort file1.txt file2.txt file2.txt | uniq -u

这里需要注意的是要求file1.txt-file2.txt,则file1.txt出现一次,file2.txt出现两次。这里file2.txt出现了两次是为了刨除在file1.txt中不存在,而在file2.txt中存在的数据的影响。两个file2.txt可以保证file2.txt中的任何内容都不会出现在差集中。

方法二:利用grep命令

grep -F -v -f file2.txt file1.txt

这里-F的含义为将pattern翻译为固定的字符串,而不是正则表达式。-f表示从文件中获取pattern。-v就是输出非匹配的行。所以上述命令简单翻译过来就是在file1.txt中找出不包含file2.txt的行,也就是file1.txt-file2.txt。

方法三:利用awk命令

awk命令绝对算是Linux命令中功能超级强大的命令之一了。以下两种方式都可以得到想要的结果。

awk 'ARGIND==1{A[$0]} ARGIND>1&&!($0 in A){print $0}' file1.txt file2.txt
awk 'NR==FNR {A[$0]} NR>FNR&&!($0 in A) {print $0}' file1.txt file2.txt

在此首先解释一下awk的工作流程:

上图是awk最权威的一本书里面的描述。它简洁明了地描述了awk的工作流程。

ARGIND: The index in ARGV of the current file being processed.

NR: 代表记录的数目,相当于当前正在执行的当前的行数

FNR: File Number of Record

NR和FNR的区别:如果有两个输入文件,NR在两个文件之间会持续增长。当开始处理第二个文件时,NR不会被置为1,相反它会从第一个文件的最大值处继续递增。

所以上述两条命令的本质就是:当AWK处理的是第一个文件时,将第一个文件的每一行数据作为A的键;当处理到第二个文件时,如果读取的某一行数据在A中的键中不存在,就把它打印出来,这行数据就是文件1中不存在的数据。整个AWK过程处理完,就会把所有在文件2中存在但是在文件1中不存在的是数据给打印出来了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值