2013-12-20 25 views
1

我有兩個格式的文本文件。兩個列表,如果找到一個常見匹配打印另一個列表元素

File 1 
Column A Column B  

File 2 
Column B Column C 

在文件2,B欄是僅在一個文件中的數據的子集1

我想搜索文件1中,如果發現匹配,以列B的數據點在文件2中,打印列A值。

任何人都可以建議如何以一種簡單的方式做到這一點?最好是Python或Bash。

非常感謝。

一個例子

File 1 
Bruce Dog 
Frank Cat 
Adam Fish 
Alex Horse 

File 2 
Dog Blue 
Fish Green 

將打印:

Bruce 
Adam 
+0

您好!到目前爲止,你在Python或Bash中嘗試了些什麼?你開始了哪些教程並且無法獲得? –

回答

4

這可以很容易通過使用詞典

  1. 創建從所述第二文件中的元素的字典來實現。將每行分割爲一個鍵:值對。
  2. 對於第一個文件的每一行,再次把它分解爲重點:價值和在你的字典裏搜索的值
  3. 如果發現,從第一個文件打印值你迭代

示例實現

from itertools import imap 
file2 = dict(imap(str.split, open("file2"))) 
with open("file1") as fin: 
    for key, value in imap(str.split, fin): 
     if value in file2: 
      print key 

注到OP

如果您所關注的處理沒有明確關閉,因爲文件的資源泄漏,封閉第一條語句中有條款

with open("file2") as fin: 
    file2 = dict(imap(str.split, fin)) 
+1

這樣,'file2'永遠不會正確關閉。 –

+0

@tobias_k:關於此事的爭論一直存在,GC是否會妥善關閉文件,以及何時關閉文件。我發現這個實現沒有問題。如果您覺得有問題,請隨時忽略。 – Abhijit

0

你嘗試過什麼?

這裏的算法的思想:

  1. 檢索文件中的行他們店爲可變foo
  2. 檢索文件B店他們行到變量bar
  3. 拆分變量foo使用將空格分成foosplited
  4. 將變量bar拆分爲barsplited
  5. 做一個循環:對於foosplited中奇數i索引的每個元素,查看barsplited中偶數索引的元素(如果它們相同)。如果相同,轉到6;否,轉到7
  6. 打印foosplited[i-1]
  7. 繼續循環
  8. 暫停
0
dict1 = {} 

for line in file1: 
    # The 2nd word will be the key, the 1st will be the value 
    words = line.split() 
    dict1(words[1]) = words[0] 

for line in file2: 
    words = line.split() 
    if dict1.has_key(words[0]): 
     print words[1] 
0
$ join -12 -21 -o 1.1 <(sort -k2,2 file1) <(sort file2) 
Bruce 
Adam 

因爲join需要的文件以在連接字段進行排序,則無法保證您的輸出順序。如果您希望輸出的順序與輸入文件相同,請使用awk--如果您搜索的話,這裏有很多示例。

0
with open('file1.txt') as f1: 
    d = {v:k for (k,v) in [line.split() for line in f1]} 
    with open('file2.txt') as f2: 
     print [d[k] for (k,v) in [line.split() for line in f2]] 

>>> ['Bruce', 'Adam'] 
0
with open("file1","rt") as f1, open("file2","rt") as f2: 
    data = {} 
    for line in f1: 
     line = line.replace("\n","") 
     colA,colB = line.split(" ")[:2] 
     data[colB] = colA 
    for line in f2: 
     colB = line.replace("\n","").split(" ")[0] 
     out = data.get(colB) 
     if out: 
      print out 
0

你可以做一個字典一樣,從第一個文件:

dict1 = { 
    "Dog": "Bruce Dog", 
    "Cat": "Frank Cat" 
} 

所以第二列將鍵和值將包含。然後從第二個文件的第一列創建e set

設置1 =集([ 「魚」, 「狗」])

然後創建另一組從dict1鍵和拍照intersection

intersect = set(dict1.keys().intersection()) 
print intersect 
>> set(["Dog"]) 
for i in intersect: 
    print dict1[i] 
相關問題