是否有匹配文件中單詞列表的方式? 我有兩個文件,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的名單。
是否有匹配文件中單詞列表的方式? 我有兩個文件,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的名單。
這種方法將所有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加載到集合中。
感謝您的回覆。我沒有使用python,並不知道如何運行這個。請指教。我應該複製這個作爲我的腳本,然後我如何運行它?我只是用我的文件名更改'A'和'B'? – user1007742
是的,腳本必須在具有兩個文件的同一目錄中運行。您可以通過執行以下命令來運行它:python ./scriptName.py或chmod + x ./scriptName.py; ./scriptName.py – mr2ert
我收到以下錯誤消息文件「./extractMAtches.py」,第20行 word = line.strip().split()[ - 1] ^ IndentationError:預計有一個縮進塊。我的數據是製表符分隔可以是因爲這一點? – user1007742
將文件A加載到內存中會不合理嗎? – mr2ert
@ mr2ert你是什麼意思? – user1007742
我只是繼續前進,掀起了一些代碼,看到我的答案。 – mr2ert