2012-05-08 3 views
3

pythonの "grep"の代替案と同様の質問;ここでの複雑さは、別のファイルからの変数(行)であることです。私は)(re.findallのように、この使用して機能を実行する方法を別のファイルから1つのファイルの行をgrepするためにpythonを使用

FILE1を把握することはできません。

1 20 200 
1 30 300 

FILE2:

1 20 200 0.1 0.5 
1 20 200 0.3 0.1 
1 30 300 0.2 0.6 
1 40 400 0.9 0.6 
2 50 300 0.5 0.7 

ファイル1からの各ラインは私のパターンです。そのようなパターンをfile2から検索する必要があります。私はbashやpythonのいずれかを使用して問題を解決しようとしてきた

1 20 200 0.1 0.5 
    1 20 200 0.3 0.1 
    1 30 300 0.2 0.6 

が、把握することはできません。 すると結果がでなければなりません。 THX

答えて

4

ここで非正規表現ベースです解決策:

+2

文字列メソッドの代わりに、正規表現の使用のための私の1を取ります。 ;)改善: 'line1'をセットにして、メンバーシップテストを' O(n) 'から' O(1) 'にスピードアップします。 –

+1

おそらく私は何かが欠落しているかもしれませんが、コードは 'lines1'のメンバシップテストを行うことはありません。' lines1'の内容を反復するだけですか? – srgerg

+0

2番目のループ内でテストを行います(コードの最後から2番目まで) – happydave

0

は、私はあなたがあなた自身のループを必要とすると思う

file1patterns = [ re.Pattern(l) for l in f1.readlines() ] 
lineToMatch = 0 
matchedLines = [] 
for line in f2.readlines(): 
    if file1patterns[lineToMatch].matches(line): 
    matchedLines += line 
    lineToMatch += 1 
    else: 
    lineToMatch = 0 
    matchedLines = [] 
    if len(matchedLines) == len(file1patterns) 
    print matchedLines 
    lineToMatch = 0 
    matchedLines = [] 

(パイソンをコンパイル実際、うまくいけば十分にあなたが前進するためではない)あなたは事実を利用することができます

1

import re 

with open('file1') as file1: 
    patterns = "|".join(re.escape(line.rstrip()) for line in file1) 

regexp = re.compile(patterns) 
with open('file2') as file2: 
    for line in file2: 
     if regexp.search(line): 
      print line.rstrip() 

WHE:正規表現で|文字は、その左側のパターン、またはその右側のパターンのいずれかと一致することを意味しますあなたはbashで、この問題を解決したい場合は、次のようにそれを行う必要があり、

ちなみに
1 20 200 0.1 0.5 
1 20 200 0.3 0.1 
1 30 300 0.2 0.6 

:nは私はそれは、出力、あなたのサンプルファイルでこれを試してみました

grep -f file1 file2 
0

手順1:ファイル1からすべての行を読み込み、分割してタプルとしてセットに追加します。これにより、次のステップでより高速な検索ができます。

with open('file1', 'r') as f: 
    file1_lines = set([tuple(line.strip().split()) for line in f]) 

ステップ2:彼らはFILE1内の行のいずれかで始まる場合は、あなたの基準を満たすFILE2からフィルタラインはすなわち:

with open('file2', 'r') as f2: 
    for line in itertools.ifilter(lambda x: tuple(x.split()[:3]) in file1_lines, f2): 
     print line 
関連する問題