0

シーケンス Fastq ファイルを編集し、特定の文字位置でのみ繰り返される行を削除したいと考えています。理想的には、入力ファイルのすべての行を繰り返し処理し、一意の文字セットのインスタンスが 1 つしかないファイルを出力します。

以下に示すように。すべての行の最初の 6 文字、最後の 6 文字、および間にある文字の一部だけに注目し、3 つのシーケンスの一意の組み合わせのインスタンスを 1 つだけ保持します。

AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA    Start by comparing to this line
AAAAAACCCAAACCCCCCTTTTTTTTTTCCCCCCCCAAAAAA    1-6, 19-28, 37-42 are same, so delete
AAAAAACCCCCCCCCCCCTTTTTTTTTTCCCAAACCAAAAAA    1-6, 19-28, 37-42 are same, so delete
TTTTTTCCCCCCCCCCCCTTTTTTTTTTCCCCCCCCAAAAAA    1-6 and 36-42 are same but 37-42 are different so keep

上記の例に示すように、4 行のみを含むファイルを取得し、文字 1 ~ 6、19 ~ 28、37 ~ 42 を見ている場合、2 行目と 3 行目は削除されるか、出力ファイルに出力されません。目的の各位置に同じ文字があるためですが、4 行目は異なるため削除されません。

私はこの次のコードから始めました。私の考えは、各位置を変数に設定し (ただし、介在するシーケンスを取得する必要があるかどうかはわかりません)、入力ファイルを反復処理するときに各行と比較することです。

with open(current_file, 'r') as f:
    next(f)
    for line in f:
        start = line[:6]
        end = line[-7:]

それが役立つ場合、これらのファイルも 5 ~ 10 GB であるため、小さくはありません。助けていただければ幸いです。ありがとう。

4

2 に答える 2

1

次の処理を行うスクリプトを次に示します。各行から要素を結合文字列として取得し、既に確認されている結合文字列のリストと照合し、その行が新しいインスタンスである場合はリストに追加します。

with open('path/to/file', 'r') as f:
    lineCharsList = []
    outLines = []
    for line in f:
        lineChars = line[0:6]+line[18:28]+line[36:42]
        if not (lineChars in lineCharsList):
            lineCharsList.append(lineChars)
            outLines.append(line)
于 2015-06-12T16:37:12.333 に答える