花式挑出兩個(gè)文檔中相同的行
在我們的工作或?qū)W習(xí)您可能會(huì)碰到這樣的情況,需要去比較兩個(gè)文本文件,挑出兩個(gè)文件中相同的或者不相同的行,可能大家在碰到這樣的需求時(shí),可能會(huì)想著用兩層循環(huán)去遍歷這兩個(gè)文件,然后做比較。用這種思路去解決問(wèn)題,不管用shell還是Python一定是可行的。筆者在這里介紹幾種高效、簡(jiǎn)單的方式。
筆者用a.txt和b.txt這兩個(gè)文件來(lái)加以說(shuō)明如果找出兩個(gè)文件中相同的行。


從這兩個(gè)文檔里可以看出它們有兩同的部分也有不相同的部分。
1.思路:使用cat將兩個(gè)文檔連接起來(lái),然后用sort進(jìn)行計(jì)數(shù),再用awk將計(jì)數(shù)為2的過(guò)濾出來(lái)
2.使用comm(有的系統(tǒng)上的名字叫common),comm可以找出兩個(gè)文件中各自獨(dú)有和共同擁有的行,不過(guò)comm比較兩個(gè)文件之前需要對(duì)兩個(gè)文件進(jìn)行排序。
以下是排序后的結(jié)果
將兩個(gè)文件進(jìn)行comm比較后,可以看到第一列只顯示了c.txt獨(dú)自擁有的行,第二列顯示d.txt擁有的行。第三列顯示是的兩個(gè)文件共有的行。
通過(guò)使用-1 -2的參數(shù)可以去掉第一列和第二列。
3.使用純粹的awk來(lái)完成
解釋一下這行命令的意思,NR和FNR的意思相近,NR,表示awk開(kāi)始執(zhí)行程序后所讀取的數(shù)據(jù)行數(shù)。FNR,與NR功用類(lèi)似,不同的是awk每打開(kāi)一個(gè)新文件,FNR便從0重新累計(jì)。所以NR==FNR表示如果是第一個(gè)文件,即c.txt,NR>FNR表示如果是第二個(gè)文件即d.txt。a[$0]就是以每行內(nèi)容為index的一個(gè)hash表;由于執(zhí)行了++,它的初值變成了0。如果你打印了a[$0],你會(huì)發(fā)現(xiàn)它其實(shí)就是行數(shù)的重復(fù)次數(shù),后面的NR>FNR&&a[$0],在d.txt文件中并且匹配到與c.txt文件相同的行打印該行(行為語(yǔ)句為空,表示打印該行)。
小結(jié):使用第一種和第二種方法來(lái)處理文本比較高效,使用純粹的awk看起來(lái)比較復(fù)雜,但awk處理起來(lái)文本更加靈活多變,理解awk在此處的用法對(duì)awk的學(xué)習(xí)是有幫助的。