最近 ghxiao 童鞋常常问我用perl处理数据的问题。今天来分享一段代码吧。
比如说,给出一个序列文件,里面都是Fasta格式的序列。 然后序列里面有一些NNNNNN的连续字符。
问题就是要得出这些NNNN的一段字符在该序列的具体位置。(就是匹配某字符串)
例子文件:seq.fasta
>CMM_00532 CGCGCGCTGTGCTACGCAGGCCTCTTCCAGGCCCATCTCCCGGCGGCGTGCACCACTACC AGGATGGTGTGCGTGGGCGGGGGCGCCGCCGAGCTGGTCGCCTTTGCCAGCTTCTTGGGC GACGACGACGACGACGACGGGGCGCACAGCAGCAGGCGCGGGGAGCTGACGCTNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGTCGACGCGGCGCCGTGGGAGGGCGT CGCGGACACGGTGCTGCGCGCGCTCACGACGCCGCTGCCGCTGTCCCCAGTCCGGAGCAG >CMM_00589 ACGGGCGTGTTCCTGGCGTACGGCGGCAGCGACGATGCGCTGCCGGAGGCGGGCCTCGCG GTGCGCATGAACGACGGGCCTTCGGGCCCTGCGTTTTGGCCGCAGCCGCGCCTGCGGCTC ATGGAGATGCTGCTGCCGTACCTCGACCAGCACCGCTTCGCGGCCGGCGATATNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGCCTGGCATCTGCGGCAGCAGTGGGAC GTGCCGCGGACGCACGCGTACTACGTGCCGCCCGGCGCCGTGCGGACGGCCGCGCCGCTG CTGCTCATGGCGGCGACGCGCGACCCCGTGACGCCGTATGCGGCGGCGCGCGCGGCGCTC >CMM_00662 GCCGTACTCTCCCAGAACGACTTGGCCTCTGCCCGTACCCTCTTTAAAGACAACCTCAAC CTGACGCCCTATATTGCCTCGACCGAGTGCAGCGGCGTGTGGGCGCGCCGNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNGGGCCGCCGGACGAGGAGCGCGGCATGGTC GAGGTCGGGTACGGGATCGACCCGGCGTGCCGGCGGCGGGGACACGCGCGGGCGGCGCTG >CMM_00942 CTCAACCTGCGCGACGCCGGCGCCGTGGCGGGCAGCGCGATCCCCGCCGGGCGCGTGTAC CGCTGCGGCACGCTCGAGTACGCGGCCGCCNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN NNNNNNNNNNCTCGCCGACTTTGCCGAGGCCGGGGCGTCGCCGCCTGGCGCACGCAGTAC CTCCACGTCGCGCTGGCGTATGCGCCCACGTTCCGCGCCGTCCTGGAGCATGTGCGCGAC
只取了一小部分数据。
分析:
- 1,CMM_开头的是该序列的ID
2,序列有几行。所以要去掉换行符,先变成一行。这样才能得出正确的位置。
代码例子:temp.pl
$/ = ">";
print "id\tstart\tend\tlen\n"; #先输出Title
while(<>){
if($_ =~ /(CMM.*?)\s(.*)>/ms){ #第一个括号匹配ID。第二个匹配序列
$id = $1;
$seq = $2;
$seq =~ s/\s//g; #把序列里的换行去掉。变成一列
while ($seq =~ m/(N+)/g) { #匹配一个N或以上的字符
$len = length($1); #返回这段匹配的长度
$end = pos($seq); #用pos函数返回该匹配的终止位置
$start = $end - $len + 1; #计算出起始位置
print "$id\t$start\t$end\t$len\n"; #输出结果
}
}
}
运行 perl temp.pl seq.fasta >output
输出output文件。
~完。
有点相关的文章
- Perl处理Fasta序列的又一实例 (0.535)
- 用Perl抓取网页和提交表格 (0.535)
- 用perl统计一个六种类型的数据 (0.535)
- 两种办法批量去掉重复数据 (0.500)
- Linux下大文件的排序和去重复 (0.500)
- Perl:用Net::FTP来上传下载文件 (RANDOM - 0.035)







看不懂
[回复]
看不懂+1
[回复]
学习一下!
[回复]
太专业了。。
[回复]
我PHP不行,看不懂了!!!!!
[回复]
好像不是PHP吧!楼上的看错了!
[回复]
perl...
[回复]
好像不是PHP吧!、
[回复]
太专业了。。
[回复]
直接把序列读进去了 比较占内存啊
[回复]
我正在做相关的事情 希望进一步探讨 加了你gtalk
[回复]
收藏了,
[回复]
这里有个问题
我每次运行都会漏掉最后一个序列
[回复]
yun云里雾里
[回复]
if($_ =~ /(CMM.*?)\s(.*)>/ms)
>(多余)将丢失最后一条记录!
(CMM.*?)\s
其中CMM可以不要!
为什么不是\n换行符?但是\s也work!奇怪!
[回复]