2013-07-10 52 views
0

是否有匹配文件中單詞列表的方式? 我有兩個文件,A和B A的話從單詞列表中查找模式

A 
abcd 
xyzt 

而文件B

B 
abcdefgh abcd 
abcdytqw wert 
zswertyu xyzt 

我想從FILEB提取線1和3的列表。我想匹配A到B的第二列,如果匹配的打印是B.線

輸出將被

abcdefgh abcd 
zswertyu xyzt 

我已經嘗試了這個用grep在Perl在for循環中。但它太慢了。 我有超過100K的名單。

+0

將文件A加載到內存中會不合理嗎? – mr2ert

+0

@ mr2ert你是什麼意思? – user1007742

+0

我只是繼續前進,掀起了一些代碼,看到我的答案。 – mr2ert

回答

0

這種方法將所有A加載到一個集合中以加快速度。如果不將A加載到內存中,則必須將A的每一行與文件B的全部內容進行比較。通過將A加載到內存中,您只需要遍歷每個文件一次。此外,由於A是在存儲器它會快得多,以檢查是否B的第二列是A.

下面是這種在python一個例子:

#!/usr/bin/env python 

def load_data(filename): 
    with open(filename, 'r') as infile: 
     Aset = set() 
     for line in infile: 
      word = line.strip() 
      if word == '': 
       continue 
      Aset.add(word) 
    return Aset 

if __name__ == '__main__': 
    Aset = load_data('A') 

    with open('B', 'r') as infile: 
     for line in infile: 
      # Assumes that each line in B will have at least 2 columns. 
      # And that the column you are checking against is the last. 
      word = line.strip().split()[-1] 
      if word in Aset: 
       print line.strip() 

這不會如果機器工作沒有足夠的(空閒)內存將全部文件A加載到集合中。

+0

感謝您的回覆。我沒有使用python,並不知道如何運行這個。請指教。我應該複製這個作爲我的腳本,然後我如何運行它?我只是用我的文件名更改'A'和'B'? – user1007742

+0

是的,腳本必須在具有兩個文件的同一目錄中運行。您可以通過執行以下命令來運行它:python ./scriptName.py或chmod + x ./scriptName.py; ./scriptName.py – mr2ert

+0

我收到以下錯誤消息文件「./extractMAtches.py」,第20行 word = line.strip().split()[ - 1] ^ IndentationError:預計有一個縮進塊。我的數據是製表符分隔可以是因爲這一點? – user1007742