我想去除一组序列(大约1000条)中指定区段序列,例如
file1中包含原始待处理序列,格式和内容如下:
>AT2G01210.1
MLASLIIFVALLCNVTVISGLN
>AT2G01820.1
MSNSHLGTLCFIISLLGLANFSLS
>AT2G01950.1
MTTSPIRVRIRTRIQISFIFLLTHL
file2中包含指定区段信息,格式和内容如下:
AT2G01210.1 1 12
AT2G01820.1 2 5,10 14,17 20
AT2G01950.1 3 7,12 15
要求得到file3,内容如下:
>AT2G01210.1
CNVTVISGLN
>AT2G01820.1
MLGTLLLFSLS
>AT2G01950.1
MTVRIRISFIFLLTHL
上面是个简单的例子,实际情况就是序列长一些,序列数多一些。
终端命令形式希望是cutseq.pl file1 file2 file3
哪位高手能够帮助小弟一下,写下perl命令,感激不尽,新的一年必将身体健康工作顺利!!!
|
3 answers54views
未解决
|
|
实在是不好意思,我不会perl,我只会python,所以我用我那蹩脚的python写了个代码,测试通过,不知道你能否用上。。
代码如下
#coding=utf-8 #file1中包含原始待处理序列,格式和内容如下: #>AT2G01210.1 #MLASLIIFVALLCNVTVISGLN #>AT2G01820.1 #MSNSHLGTLCFIISLLGLANFSLS #>AT2G01950.1 #MTTSPIRVRIRTRIQISFIFLLTHL #file2中包含指定区段信息,格式和内容如下: #AT2G01210.1 1 12 #AT2G01820.1 2 5,10 14,17 20 #AT2G01950.1 3 7,12 15 #要求得到file3,内容如下: #>AT2G01210.1 #CNVTVISGLN #>AT2G01820.1 #MLGTLLLFSLS #>AT2G01950.1 #MTVRIRISFIFLLTHL #上面是个简单的例子,实际情况就是序列长一些,序列数多一些。 #终端命令形式希望是cutseq.pl file1 file2 file3 import sys def getf(fileA,fileB,fileC):#定义主要函数 file1=open(fileA,'r')#依次打开文件,根据文件不同功能进行读写 file2=open(fileB,'r') file3=open(fileC,'w+') file1s=file1.readlines() line=file2.readline()#使用while循环方式的readline while line: position=file1s.index('>'+line.split()[0]+'\n')+1#索引到对应名称的对应序列 e=getp(line,file1s[position],1)#使用的一个函数获得截取字符串 file3.write('>'+line.split()[0]+'\n'+e)#写入file3 line=file2.readline()#读行再次循环 file1.close()#依次关闭文件 file2.close() file3.close() def getp(a,b,n):#获得截取字符串函数,这里的n是因为默认开始为0,而你这为1,所以为了灵活,使用变量,即比默认多1,如果开始为0则n为0 #a='AT2G01210.1 1 12,14 18' #b='<MLASLIIFVALL>CN<VTVIS>GLN'=CNGLN c=a.split() e=b[0:int(c[1])-n] #e=b[0:int(c[1])]#原理就是头尾相加,中间有,号的使用循环 for i in c[2:-1]: e+=b[int(i.split(',')[0])+1-n:int(i.split(',')[1])-n] e+=b[int(c[-1])+1-n:] return e if __name__=='__main__': if len(sys.argv)==4: getf(sys.argv[1],sys.argv[2],sys.argv[3]) else: print 'INPUT LIKE THIS: python cutseq.py file1 file2 file3'10●
用perl应该好解决的呀,先遍历file1,读取基因位置号,读取序列,然后打开file2,查找到位置信息,然后用substr函数截取字符串,将结果输出到file3就可以了。
7●
@rusaer:呵呵 十分感谢您的帮助
我想我该学习一些简单的基础编程语言 不能总靠别人的帮助
1●