awk、perl如何获取特定字符串之间的信息(开放阅读框)
我有一个文本,如下:
__________________________________________________
- NM_130786 acgctcatgccgcctaattatgcccgcgtaac
- NM_014576 tttatgatgacgtaaatgaatgatccatga
- NM_001142333 tcatggacaacagttagccatcaccccatag
- NM_033110 atgctgtgaagg
- NM_033112 ctgctgtgaagg
_______________________________________________
第一列我们称之为NM号,第二列是相应的序列字符串.如果我想读取第二列中从atg开始的每三个字符直到遇上tga或者taa或者tag为止的片段(也就是说该片段长度需要为3的倍数),把这个片段输出.也就是说期望得到的片段是:
__________________________________________________
- NM_130786 atgccgcctaa
- NM_130786 atgcccgcgtaa
- NM_014576 atgacgtaa
- NM_014576 atgaatgatccatga
- NM_001142333 atggacaacagttag
- 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 }