花式挑出两个文档中相同的行
在我们的工作或学习您可能会碰到这样的情况,需要去比较两个文本文件,挑出两个文件中相同的或者不相同的行,可能大家在碰到这样的需求时,可能会想着用两层循环去遍历这两个文件,然后做比较。用这种思路去解决问题,不管用shell还是Python一定是可行的。笔者在这里介绍几种高效、简单的方式。
笔者用a.txt和b.txt这两个文件来加以说明如果找出两个文件中相同的行。
从这两个文档里可以看出它们有两同的部分也有不相同的部分。
1.思路:使用cat将两个文档连接起来,然后用sort进行计数,再用awk将计数为2的过滤出来
2.使用comm(有的系统上的名字叫common),comm可以找出两个文件中各自独有和共同拥有的行,不过comm比较两个文件之前需要对两个文件进行排序。
以下是排序后的结果
将两个文件进行comm比较后,可以看到第一列只显示了c.txt独自拥有的行,第二列显示d.txt拥有的行。第三列显示是的两个文件共有的行。
通过使用-1 -2的参数可以去掉第一列和第二列。
3.使用纯粹的awk来完成
解释一下这行命令的意思,NR和FNR的意思相近,NR,表示awk开始执行程序后所读取的数据行数。FNR,与NR功用类似,不同的是awk每打开一个新文件,FNR便从0重新累计。所以NR==FNR表示如果是第一个文件,即c.txt,NR>FNR表示如果是第二个文件即d.txt。a[$0]就是以每行内容为index的一个hash表;由于执行了++,它的初值变成了0。如果你打印了a[$0],你会发现它其实就是行数的重复次数,后面的NR>FNR&&a[$0],在d.txt文件中并且匹配到与c.txt文件相同的行打印该行(行为语句为空,表示打印该行)。
小结:使用第一种和第二种方法来处理文本比较高效,使用纯粹的awk看起来比较复杂,但awk处理起来文本更加灵活多变,理解awk在此处的用法对awk的学习是有帮助的。