2013-03-18 55 views
10

從unix終端,我們可以使用diff file1 file2來查找兩個文件之間的區別。是否有類似的命令來顯示2個文件的相似性?每個文件都包含一個字符串句子線(讓許多管道,如果必要如何查找2個不同文件中的重複行? Unix

;它們進行排序和複製與sort file1 | uniq刪除線

file1:。http://pastebin.com/taRcegVn

file2http://pastebin.com/2fXeMrHQ

而且輸出應輸出出現在兩個文件中的行。

outputhttp://pastebin.com/FnjXFshs

我可以使用Python做它是這樣,但我認爲這是一個有點太投入了終端:

x = set([i.strip() for i in open('wn-rb.dic')]) 
y = set([i.strip() for i in open('wn-s.dic')]) 
z = x.intersection(y) 
outfile = open('reverse-diff.out') 
for i in z: 
    print>>outfile, i 
+0

做你的文件是什麼樣子? – paulmelnikow 2013-03-18 05:26:46

+3

可能重複[如何顯示共同線(反向差異)?](http://stackoverflow.com/questions/746458/how-to-show-lines-in-common-reverse-diff) – tjameson 2013-03-18 05:26:47

+0

大多數時間a一串人類語言句子。有時也列出更多信息。 – alvas 2013-03-18 05:37:15

回答

9

由於@tjameson提到它可能在另一個線程來解決。 只是想發佈另一種解決方案: sort file1 file2 | awk 'dup[$0]++ == 1'

  1. awk guide得到一些AWK 基礎,當行的模式值爲true,但此線將 印刷

  2. DUP [ $ 0]是一個散列表,其中每個鍵是每一行的輸入,原始值爲0,並且一旦發生這一行就增加,當它再次發生時 的值應該爲1,因此dup[$0]++ == 1爲真。 然後打印此行。

請注意,只有在問題中指定的文件中沒有重複時纔可以使用。

+0

你能解釋'awk'dup [$ 0] ++ == 1''是如何工作的嗎?您的解決方案比混淆的'comm' – alvas 2013-03-18 05:52:07

+0

@ 2er0更好,答案更新 – 2013-03-18 06:13:15

+1

awk使用'pattern {action}'表示法。由於這不是大括號,所以它是一種模式。 「$ 0」是當前行。 'dup [$ 0]'是一個由行索引的關聯數組;首次創建時,值爲0; 'dup [$ 0] ++'後增加值,所以它第一次返回0,第二次返回1,等等。當它的值爲1時,條件爲真,所以默認行爲(打印行)被執行。 – 2013-03-18 06:14:42

24

如果你想重複行的列表,而不訴諸AWK,您可以使用-d flag to uniq

sort file1 file2 | uniq -d 
+1

使用最簡單的工具來實現目標。 – 2014-12-01 11:36:39

+0

另外,刪除-d可以讓你從兩個文件中找到所有不同的行,這正是我所需要的。 – Aaron 2015-03-05 19:07:27