2016-04-08 14 views
0

以下で説明する問題で苦労しています。私も不完全なpythonスクリプトを共有していますが、この問題ではうまくいきません。スクリプトのサポートや指示を受けることに感謝します。それは最初の試合を除いて連続して重複している場合 -列を基準にして連続した重複行を削除する

+ 5  1364182 TTGC 
- 5  1364204 GATG 
+ 1  9372980 TTCA 
- 1  9373028 GGAA 
+ 2  14029383 ACCA 
- 2  14029437 ACCA 
- 1  19815169 AGTT 
- 1  19815254 CCGT 
+ 4  13475195 AGCA 
- 4  13475251 TCTC 
- 5  64182  TTGC 
- 5  64204  GATG 
+ 1  9372980 TTCA 
- 1  9373028 GGAA 
+ 2  14029383 ACCA 
- 2  14029586 ACCT 

私は私の最初の列に基づいて行全体を削除しようとしている(+であるとする):

私のタブは、このようなファイルを見て区切り。

+ 5  1364182 TTGC 
- 5  1364204 GATG 
+ 1  9372980 TTCA 
- 1  9373028 GGAA 
+ 2  14029383 ACCA 
- 2  14029437 ACCA 
+ 4  13475195 AGCA 
- 4  13475251 TCTC 
+ 1  9372980 TTCA 
- 1  9373028 GGAA 
+ 2  14029383 ACCA 
- 2  14029586 ACCT 

スクリプト:

#!/usr/bin/python 

gff = raw_input("Enter the gff file: ") 
gff_file = open(gff, "r") 
f1 = open("f1", "w") 

for line in gff_file: 
     line = line.rstrip() 
     line = line.split("\t") 
     x = line[0] 
     for line1 in gff_file: 
       line1 = line1.rstrip() 
       line1 = line1.split("\t") 
       y = next(line1[0]) 
       if x != y: 
         f1.write(x + line1[0]+"\n") 

私は連続で同じ列のエントリを持つ最初の列エントリを比較することができません出力は次のようになります。 ファイルが非常に大きいため、ライナーが1つ動作しません。

+2

あなたはもっと手の込んだことができます!あなたの例は容易に理解できません! – Dataman

+0

'y = next(line1 [0])'で何を達成しようとしていますか? – Coder256

+0

なぜ '-1 19815169 AGTT'を削除しますか? –

答えて

1

これはプログラミングの試行ではなく、データを消去するだけの場合は、awkに切り替えてください。 1ライナーでさえありません。私が正しく理解していれば

$ awk 'p!=$1{p=$1; print}' file 

+ 5  1364182 TTGC 
- 5  1364204 GATG 
+ 1  9372980 TTCA 
- 1  9373028 GGAA 
+ 2  14029383 ACCA 
- 2  14029437 ACCA 
+ 4  13475195 AGCA 
- 4  13475251 TCTC 
+ 1  9372980 TTCA 
- 1  9373028 GGAA 
+ 2  14029383 ACCA 
1

、あなたは基本的に第1のシンボル(+または-)のクラスターによってグループ化していて、あなただけの最初にしておきたいです。これは、itertools.groupbyのために良いユースケースである:

from itertools import groupby 

with open("data.gff") as fp_in, open("data_reduced.gff","w") as fp_out: 
    grouped = groupby(fp_in, key=lambda x: x.split("\t")[0]) 
    for key, group in grouped: 
     fp_out.write(next(group)) 

groupbyはタブで、それを分割し、「ラインを取る意味、反復可能な(ここでは、入力ファイルfp_in)と私はlambda x: x.split("\t")[0]として渡しているキー機能を、受け入れ私に最初の要素を教えてください」。

キー(ここでは+または-)を含むペアと、グループのすべての要素(この場合は同じ記号で始まる連続する行グループ)の反復子を生成します。最初にnext(group)を選択して書き出します。

0

これはトリックを行う必要があります。

consec_lines = False 
x = None 
for line in gff_file: 
    line = line.rstrip() 
    line = line.split("\t") 
    if line[0] == x: 
     consec_lines = True 
     continue 
    x = line[0] 
    consec_lines = False 
    for i in line+"\n": 
     f1.write(i) 
関連する問題