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]