2013-04-29 67 views
4

聲明:我是新來的一般程序和腳本,所以請原諒缺乏技術方面DIFF和交叉的兩個文本之間的彙報文件

所以我有一個包含姓名兩個文本文件中的數據集列出:

First File | Second File 
bob  | bob 
mark  | mark 
larry  | bruce 
tom  | tom 

我想運行腳本(PREF蟒),其輸出在一個文本文件中的交叉線,而在另一個文本文件中的不同的線路,例如:

matches.txt

bob 
mark 
tom 

differences.txt

bruce 

我將如何做到這一點與Python?或者用Unix命令行,如果它很容易?

+2

使用'sets'和標準文件IO ...在那裏爲好措施了'string.split' :) ...或者你有什麼嘗試過,你卡在哪裏? – 2013-04-29 22:45:35

+0

Unix'diff'命令不夠好嗎? – user1613254 2013-04-29 22:49:04

+0

我懷疑訂購不重要,所以可能不會... – 2013-04-29 22:49:52

回答

4
words1 = set(open("some1.txt").read().split()) 
words2 = set(open("some2.txt").read().split()) 

duplicates = words1.intersection(words2) 
uniques = words1.difference(words2).union(words2.difference(words1)) 

print "Duplicates(%d):%s"%(len(duplicates),duplicates) 
print "\nUniques(%d):%s"%(len(uniques),uniques) 

類似的東西至少

+0

嘿,我有一個問題,如果文件太大,將整個內容存儲在設置中,有沒有任何有效的方式來做它的大文件? – Ja8zyjits 2015-07-22 11:14:18

9

Unix外殼解決方案爲:

# duplicate lines 
sort text1.txt text2.txt | uniq -d 

# unique lines 
sort text1.txt text2.txt | uniq -u 
+1

注意OP:要輸出到一個文件,只需在命令末尾用'> file.txt'重定向輸出,就像這樣:'sort text1.txt text2.txt | uniq的-d> dups.txt'通過[clfu] – 2013-04-29 23:11:43

+0

,對重複(http://www.commandlinefu.com/commands/view/5707/intersection-between-two-files#comment):'(排序-u file1的; sort -u file2)|排序| uniq -d'(這個雖然看起來也是一樣,但是更短) – 2014-09-09 11:11:30

1

Python字典是O(1)或非常接近,換句話說,他們是非常快的(但他們會使用大量內存,如果你的索引文件較大)。所以在第一個文件閱讀並構建一個字典是這樣的:

left = [x.strip() for x in open('left.txt').readlines()] 

列表內涵和鋼帶()是必需的,因爲readlines方法你手中與尾隨的換行符完整的線。這將創建文件中所有項目的列表,假設每行一個(如果它們都在同一行上,則使用.split)。

現在建立一個字典:

ldi = dict.fromkeys(left) 

這與建立在列表作爲關鍵字項目的字典。這也涉及重複。現在遍歷第二個文件並檢查密鑰是否在字典中:

matches = open('matches.txt', 'w') 
uniq = open('uniq.txt', 'w') 
for l in open('right.txt').readlines(): 
    if l.strip() in ldi: 
     # write to matches 
     matches.write(l) 
    else: 
     # write to uniq 
     uniq.write(l) 
matches.close() 
uniq.close() 
+0

想想吧,這贏得了'在left.txt中找到唯一的名字。足夠簡單,只需將dict解決方案鏡像即可獲得該解決方案,但您也可以查看python「set」類型,從而可以輕鬆確定交叉點/差異。 – izak 2013-04-29 23:00:43

16

sort | uniq很好,但comm可能會更好。 「男子通訊」獲取更多信息。

從手冊頁:

EXAMPLES 
     comm -12 file1 file2 
       Print only lines present in both file1 and file2. 

     comm -3 file1 file2 
       Print lines in file1 not in file2, and vice versa. 

您也可以使用Python的集合類型,但通訊更加容易。

0
>>> with open('first.txt') as f1, open('second.txt') as f2: 
     w1 = set(f1) 
     w2 = set(f2) 


>>> with open('matches.txt','w') as fout1, open('differences.txt','w') as fout2: 
     fout1.writelines(w1 & w2) 
     fout2.writelines(w2 - w1) 


>>> with open('matches.txt') as f: 
     print f.read() 


bob 
mark 
tom 
>>> with open('differences.txt') as f: 
     print f.read() 


bruce