2013-07-10 5 views
0

파일에서 단어 목록을 일치시키는 방법이 있습니까? 나는 두 개의 파일을 가지고 B. A는 단어 단어 목록에서 패턴을 찾으십시오.

A 
abcd 
xyzt 

그리고 파일 B 내가 fileB에서 라인 1과 3을 추출 할

B 
abcdefgh abcd 
abcdytqw wert 
zswertyu xyzt 

의 목록이 있습니다. 나는 B의 두 번째 열에 일치 할과 인쇄 일치 할 경우 라인 B.의

출력

abcdefgh abcd 
zswertyu xyzt 

내가 for 루프에 펄이 사용 그렙을 시도 할 것이다. 그러나 너무 느립니다. 나는 100K 개 이상의리스트를 가지고있다.

+0

파일 A를 메모리에로드하는 것은 무리가 있습니까? – mr2ert

+0

@ mr2ert 당신은 어떻게 당신을 의미합니까? – user1007742

+0

방금 ​​전 가서 코드를 작성했습니다. 제 답변을 참조하십시오. 답장을 보내 주셔서 감사합니다. – mr2ert

답변

0

이렇게하면 모든 것을 A로로드하여 속도를 높입니다. A를 메모리에로드하지 않으면 A의 각 행을 파일 B 전체와 비교해야합니다. A를 메모리에로드하면 각 파일을 한 번만 탐색하면됩니다.

#!/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는 메모리이기 때문에 또한 B의 두 번째 열 여기

A.

에 있는지 확인하는 것이 훨씬 빠를 것이다 것은 파이썬 이것의 예는 모든 파일 A를 세트에로드하기에 충분한 여유 메모리가 없습니다.

+0

나는 파이썬을 사용하지 않았고 이것을 어떻게 실행하는지 알지 못했다. 제발 조언. 이 스크립트를 내 스크립트로 복사 한 다음 실행하려면 어떻게해야합니까? 파일 이름을 'A'와 'B'로 변경합니까? – user1007742

+0

예, 스크립트는 두 개의 파일이있는 동일한 디렉토리에서 실행되어야합니다. 다음과 같이하면됩니다 : python ./scriptName.py 또는 chmod + x ./scriptName.py; ./scriptName.py – mr2ert

+0

다음과 같은 오류 메시지가 나타납니다. 파일 "./extractMAtches.py", line 20 word = line.strip(). split() [- 1] ^ 들여 쓰기 오류 : 들여 쓰기 블록이 예상됩니다. 내 데이터는 탭으로 구분되어 있기 때문에 그럴 수 있습니까? – user1007742

관련 문제