3
answers
54views


未解决

我想去除一组序列(大约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命令,感激不尽,新的一年必将身体健康工作顺利!!!




    1

    实在是不好意思,我不会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'

     

    Current score: 0
    [Link] | [回复Ta]
    2

    用perl应该好解决的呀,先遍历file1,读取基因位置号,读取序列,然后打开file2,查找到位置信息,然后用substr函数截取字符串,将结果输出到file3就可以了。

    Current score: 1
    [Link] | [回复Ta]
    3

    @rusaer:呵呵 十分感谢您的帮助

    我想我该学习一些简单的基础编程语言 不能总靠别人的帮助

     

    Current score: 0
    [Link] | [回复Ta]

Your Answer

You must be logged in to post a comment.

登陆后可评论。