2014-11-03 109 views
0

我想过滤出具有与其他文件的值匹配的特定值的行。我会很感激的帮助。在某些条件下过滤出行

我的数据是这样的:

文件1:

Group Position Code  Answer c1  c2 c3 c4 
    1  3  s1_60 A  etc etc etc etc 
    2  4  s2_63 T  etc2_ etc2 etc2/ etc2' 
    3  5  s1_23 A  etc3 etc3 etc3* etc3 
    3  51  s7_52 T  etc4 etc4_ etc4 etc4^ 

文件2:

>1 
ATGCGCGCGCGCGATATATTGCTGATATATATGCCTTttaagatcaatat 
tattagccccatgtgttgaagaacaaatctctctgttaaacagaaattgg 
gggggaaaataaacaggggggcaaataattctgactacaattgtatatat 
ggatatattGCGCGCGCGCGAGAGAGAGAGAtgtgttgtagataGACGAG 
>2 
tattagccccatgtgttgaagaacaaatctctctgttaaacagaaattgg 
gggggaaaataaacaggggggcaaataattctgactacaattgtatatat 
ggatatattGCGCGCaaaaaaGAGAGAGAGAGAtgtgttgtagataGACG 
>3 
tattagccccatgtgttgaagaacaaatctctctgttaaacagaaattgg 
gggggaaaataaacaggggggcaaataattctgactacaattgtatatat 
ggatatattGCGCGCGCGccggcgcgcgAGAtgtgttgtagataGACGAG 

'组' 是指号码后 '>' 上 '文件2',而“位置'指的是指定组别下的信件位置。我只想保留'Answer'列中'File2'的匹配字母的行。

因此,输出应该是这样的:

newOutput:

Group Position Code  Answer c1  c2 c3 c4 
    2  4  s2_63 T  etc2_ etc2 etc2/ etc2' 
    3  5  s1_23 A  etc3 etc3 etc3* etc3 
    3  51  s7_52 T  etc4 etc4_ etc4 etc4^ 

在 '文件1' 的第一行不包括在内,因为它有 'A',而不是 'K'

我将不胜感激任何帮助。我正在考虑从awk或python开始。我从来没有组织涉及多个文件的数据,所以这对我来说有点令人沮丧。请建议我。

回答

1
import csv 

with open("File2") as infile: 
    d = {} 
    bases = '' 
    group = None 
    for line in infile: 
     line = line.strip() 
     if line.startswith(">"): 
      if group is not None: 
       d[group] = bases 
      group = int(line[1:]) 
      bases = '' 
      continue 
     bases += line 
    d[group] = bases.upper() 

with open("File1") as infile, open('output', 'w') as outfile: 
    reader = csv.reader(infile, delimiter='\t') 
    writer = csv.writer(outfile, delimiter='\t') 
    writer.writerow(next(reader)) 
    for g, pos, code, answer, *rest in reader: 
     g = int(g) 
     pos = int(pos) 
     if d[g][pos-1] == ans: 
      writer.writerow([g, pos, code, answer] + rest) 
+0

它说: d [group] = line.strip() NameError:name'line'未定义我做错了什么? – user3557715 2014-11-03 06:18:53

+0

@ user3557715:哎呀!对于那个很抱歉。现在修复了 – inspectorG4dget 2014-11-03 06:23:08

+0

谢谢!我也注意到了它。但我有另一个问题。 on“group = int(group [1:]。strip())”我认为它对不以“>开头的线条进行分条”。它显示类似于“ValueError:无效文字为int()与基地10:'ALKFEKSSGESDGASHSDG'”有什么办法我可以适用于只有朝着以'>'开头的? – user3557715 2014-11-03 06:27:29

1

下面是一个AWK溶液:

BEGIN { 
    GROUP=1; 
    BASE=2; 
} 
NR == FNR { 
    positions[$1"_"$2]=toupper($3) 
} 

NR != FNR { 
    if($0 ~ /^>/) { 
     group=substr($0, 2, length($0)); 
    } else { 
     gsub(" ", "", $0); 
     seqs[group]=seqs[group]$0; 
    } 
} 

END { 
    print "Group","Position","Answer" 
    for(current_group in seqs) { 
     for(key in positions) { 
      split(key,position,"_"); 
      if(position[GROUP] == current_group) { 
       if(toupper(substr(seqs[group],position[BASE],1)) \ 
         == positions[key]) { 
        print position[GROUP], 
          position[BASE], 
          positions[key]; 
       } 
      } 
     } 
    } 
} 

awk -f script.awk File1 File2

输出:组3的

Group Position Answer 
2 4 T 
3 5 A 

位置51似乎是一个G,而不是一个T,所以我输出与你的不同。

+0

对不起,我有额外的列,你可以从编辑的OP看到。我应该改变什么来反映这些额外的列? – user3557715 2014-11-03 18:34:03

+0

你可以对我提供的代码进行一些表面编辑,即将额外的列存储在位置关联数组中,然后再次读出它们,虽然改变你的问题对我来说有点不公平:) – qwwqwwq 2014-11-03 20:06:49