frcd 发表于 2015-12-29 08:04:38

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

  我有一个文本,如下:
  __________________________________________________





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





[*]NM_130786atgccgcctaa
[*]NM_130786atgcccgcgtaa
[*]NM_014576   atgacgtaa
[*]NM_014576   atgaatgatccatga
[*]NM_001142333atggacaacagttag
[*]NM_033110atgctgtga


----------------------------------------------------------------------------------




grep -nP -o "atg(.{3})*?(tga|taa|tag)" 1.txt | awk -F":|[ \t]+" 'BEGIN{i=1;while(getline $0 <"1.txt" >0){a=$1;++i}}{print a[$1],$2}'
----------------------------------------------------------------------------------


1 if 这个
2
3 NM_130786atgccgcctaa # 不是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_130786atgccgcctaa # 不是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 }
  
页: [1]
查看完整版本: awk、perl如何获取特定字符串之间的信息(开放阅读框)