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


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