阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

花式挑出两个文档中相同的行

89次阅读
没有评论

共计 801 个字符,预计需要花费 3 分钟才能阅读完成。

在我们的工作或学习您可能会碰到这样的情况,需要去比较两个文本文件,挑出两个文件中相同的或者不相同的行,可能大家在碰到这样的需求时,可能会想着用两层循环去遍历这两个文件,然后做比较。用这种思路去解决问题,不管用 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 的学习是有帮助的。

 

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-12-03发表,共计801字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中