2013-07-10 3 views
0

Есть ли способ сопоставления списка слов из файла. У меня есть два файла, A и B. А имеет список словнайти шаблоны из списка слов

A 
abcd 
xyzt 

И файл B

B 
abcdefgh abcd 
abcdytqw wert 
zswertyu xyzt 

Я хочу, чтобы извлечь строки 1 и 3 из FILEB. Я хочу, чтобы соответствовать А во второй колонке B, и если он совпадает печать, что линия B.

Выход будет

abcdefgh abcd 
zswertyu xyzt 

Я попытался это с помощью Grep в Perl в цикле. Но это слишком медленно. У меня есть список более 100K.

+0

Было бы неоправданным загрузить файл A в память? – mr2ert

+0

@ mr2ert Как вы это понимаете? – user1007742

+0

Я просто пошел вперед и взломал какой-то код, посмотри на мой ответ. – mr2ert

ответ

0

Этот способ загружает все А в набор, чтобы ускорить работу. Если вы не загружаете A в память, вам придется сравнивать каждую строку A со всем файлом B. Загружая 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

Смежные вопросы