0

2 つの大きなファイルがあります。ファイル A は次のようになります。

SNP_A-1780270 rs987435 7 78599583 - C G
SNP_A-1780271 rs345783 15 33395779 - C G
SNP_A-1780272 rs955894 1 189807684 - G T
SNP_A-1780274 rs6088791 20 33907909 - A G
SNP_A-1780277 rs11180435 12 75664046 + C T
SNP_A-1780278 rs17571465 1 218890658 - A T
SNP_A-1780283 rs17011450 4 127630276 - C T

...そして950,000行あります。

ファイル B は次のようになります。

SNP_A-1780274
SNP_A-1780277
SNP_A-1780278
SNP_A-1780283
SNP_A-1780285
SNP_A-1780286
SNP_A-1780287

...そして900,000行あります。

ファイル A のファイル B の共通要素を列 1 から見つけて、次のような出力ファイルを取得する必要があります。

SNP_A-1780274 rs6088791 20 33907909 - A G
SNP_A-1780277 rs11180435 12 75664046 + C T
SNP_A-1780278 rs17571465 1 218890658 - A T
SNP_A-1780283 rs17011450 4 127630276 - C T

Pythonで最も効率的な方法でそれを行うにはどうすればよいですか?

4

3 に答える 3

2

私は口述が理想的だと思います:

>>> sa = """SNP_A-1780270 rs987435 7 78599583 - C G
SNP_A-1780271 rs345783 15 33395779 - C G
SNP_A-1780272 rs955894 1 189807684 - G T
SNP_A-1780274 rs6088791 20 33907909 - A G
SNP_A-1780277 rs11180435 12 75664046 + C T
SNP_A-1780278 rs17571465 1 218890658 - A T
SNP_A-1780283 rs17011450 4 127630276 - C T"""
>>> dict_lines = {}
>>> for line in sa.split('\n'):
    dict_lines[line.split()[0]] = line


>>> sb = """SNP_A-1780274
SNP_A-1780277
SNP_A-1780278
SNP_A-1780283
SNP_A-1780285
SNP_A-1780286
SNP_A-1780287"""
>>> for val in sb.split('\n'):
    line = dict_lines.get(val, None)
    if line:
        print line


SNP_A-1780274 rs6088791 20 33907909 - A G
SNP_A-1780277 rs11180435 12 75664046 + C T
SNP_A-1780278 rs17571465 1 218890658 - A T
SNP_A-1780283 rs17011450 4 127630276 - C T
于 2012-12-12T09:28:04.363 に答える
0

ファイル A の行が「キー」列 1 に比べて長い場合は、次の方法を試すことができます。

positions = {}
with open('fileA.txt') as fA:
    pos = 0
    for lineA in fA:
        uid = lineA.split(' ')[0] #gets SNP_A-1780270
        positions[uid] = pos
        pos += len(lineA)
with open('fileB.txt') as fB, open('fileA.txt') as fA, open('fileC.txt', 'w') as out:
    for lineB in fB:
        pos = positions[lineB.strip()]
        fA.seek(pos)
        lineA = fA.readline()
        out.write('%s\n', lineA)

pos += ...の信頼性が高いかどうかを確認する必要がありfile.tell()ます。バファリンが関与していると思います。file.tell()うまくいきませんが、pos += ...再調整も必要かもしれません。

これは dict バージョンとして必要なメモリが少なくて済みますが、ファイル A の処理により遅くなる可能性があります。

于 2012-12-12T09:36:27.317 に答える
0

Python コードから呼び出すことができればjoin filea fileb > filec、探しているものが得られます。

于 2012-12-13T04:05:43.800 に答える