awk、perl如何获取特定字符串之间的信息(开放阅读框)

我有一个文本,如下:

__________________________________________________

  1. NM_130786  acgctcatgccgcctaattatgcccgcgtaac
  2. NM_014576   tttatgatgacgtaaatgaatgatccatga
  3. NM_001142333  tcatggacaacagttagccatcaccccatag
  4. NM_033110  atgctgtgaagg
  5. NM_033112  ctgctgtgaagg

_______________________________________________
第一列我们称之为NM号,第二列是相应的序列字符串.如果我想读取第二列中从atg开始的每三个字符直到遇上tga或者taa或者tag为止的片段(也就是说该片段长度需要为3的倍数),把这个片段输出.也就是说期望得到的片段是:
__________________________________________________

  1. NM_130786  atgccgcctaa
  2. NM_130786  atgcccgcgtaa
  3. NM_014576   atgacgtaa
  4. NM_014576   atgaatgatccatga
  5. NM_001142333  atggacaacagttag
  6. NM_033110  atgctgtga
----------------------------------------------------------------------------------
grep -nP -o "atg(.{3})*?(tga|taa|tag)" 1.txt | awk -F":|[ \t]+" 'BEGIN{i=1;while(getline $0 <"1.txt" >0){a[i]=$1;++i}}{print a[$1],$2}'
----------------------------------------------------------------------------------
 1 if 这个
 2 
 3 NM_130786  [b]atgccgcctaa[/b] # 不是3的倍数
 4 
 5 不符合条件,试试这个:
 6 #!/usr/bin/perl
 7 my $R = 'tga|tag|taa';
 8 while () {
 9     my ( $N, $S ) = split;
10     print map "$N\t$_$/", map /(?:atg){0,}(atg(?:...)+?(?:$R))/g, $S;
11 }
12 
13 
14 if 这个
15 NM_130786  [b]atgccgcctaa[/b] # 不是3的倍数
16 
17 符合条件,试试这个:
18 #!/usr/bin/perl
19 my $R = 'tga|tag|taa';
20 while () {
21     my ( $N, $S ) = split;
22     print map "$N\t$_$/", map /(?:atg){0,}(atg(?:...)+?.*?(?:$R))/g, $S;
23 }

 

posted on 2013-12-12 18:04  三川  阅读(440)  评论(0编辑  收藏  举报