把多个文件中的180条蛋白序列ID替换为物种编号

sh/bash/dash/ksh/zsh等Shell脚本
回复
yhzii
帖子: 13
注册时间: 2021-08-23 21:23
系统: ubuntu20.4.2

把多个文件中的180条蛋白序列ID替换为物种编号

#1

帖子 yhzii » 2021-10-21 15:21

请问大家,
我有100个蛋白序列文件,每个蛋白序列文件中包含约180条蛋白序列,需要把每条序列ID替换为对应的物种编号;序列ID和物种编号的对应关系在另一个矩阵文件(matrix.txt)中存储,矩阵中的列名即为物种编号,每个单元格是序列ID,一个物种中包含很多条序列。请问代码应当如何编写?
我尝试了for循环里使用sed awk但都很难做到。 :Cry
希望大佬们帮我指点一下。拜托啦

附件是待替换的蛋白序列文件和物种编号矩阵。
附件
proteins_seqID_PF00466-Ribosomal_L10.HMM1.txt
(53.36 KiB) 已下载 94 次
matrix.txt
(15.05 KiB) 已下载 100 次
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 把多个文件中的180条蛋白序列ID替换为物种编号

#2

帖子 lilydjwg » 2021-10-21 16:23

要是我就用 Python 写了,有这个提问的时间,我的 Python 脚本都写好了……
shell 脚本不擅长比较精细的处理。
yhzii
帖子: 13
注册时间: 2021-08-23 21:23
系统: ubuntu20.4.2

Re: 把多个文件中的180条蛋白序列ID替换为物种编号

#3

帖子 yhzii » 2021-10-21 18:19

lilydjwg 写了: 2021-10-21 16:23 要是我就用 Python 写了,有这个提问的时间,我的 Python 脚本都写好了……
shell 脚本不擅长比较精细的处理。
能大概说明一下python的步骤吗?比如用到什么插件,分成几步?因为python我不太会
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 把多个文件中的180条蛋白序列ID替换为物种编号

#4

帖子 lilydjwg » 2021-10-21 19:15

yhzii 写了: 2021-10-21 18:19
lilydjwg 写了: 2021-10-21 16:23 要是我就用 Python 写了,有这个提问的时间,我的 Python 脚本都写好了……
shell 脚本不擅长比较精细的处理。
能大概说明一下python的步骤吗?比如用到什么插件,分成几步?因为python我不太会
你会什么语言就用什么语言呀。(都不会的话建议学一下 Python)
用不上什么插件啥的。

把替换表读进来。
把数据读进来。
查表替换。
输出结果。
完。
yhzii
帖子: 13
注册时间: 2021-08-23 21:23
系统: ubuntu20.4.2

Re: 把多个文件中的180条蛋白序列ID替换为物种编号

#5

帖子 yhzii » 2021-10-21 20:24

lilydjwg 写了: 2021-10-21 19:15
yhzii 写了: 2021-10-21 18:19
lilydjwg 写了: 2021-10-21 16:23 要是我就用 Python 写了,有这个提问的时间,我的 Python 脚本都写好了……
shell 脚本不擅长比较精细的处理。
能大概说明一下python的步骤吗?比如用到什么插件,分成几步?因为python我不太会
你会什么语言就用什么语言呀。(都不会的话建议学一下 Python)
用不上什么插件啥的。

把替换表读进来。
把数据读进来。
查表替换。
输出结果。
完。
好的,我去试试。多谢了
yhzii
帖子: 13
注册时间: 2021-08-23 21:23
系统: ubuntu20.4.2

Re: 把多个文件中的180条蛋白序列ID替换为物种编号

#6

帖子 yhzii » 2021-10-25 19:45

yhzii 写了: 2021-10-21 20:24
lilydjwg 写了: 2021-10-21 19:15
yhzii 写了: 2021-10-21 18:19
lilydjwg 写了: 2021-10-21 16:23 要是我就用 Python 写了,有这个提问的时间,我的 Python 脚本都写好了……
shell 脚本不擅长比较精细的处理。
能大概说明一下python的步骤吗?比如用到什么插件,分成几步?因为python我不太会
你会什么语言就用什么语言呀。(都不会的话建议学一下 Python)
用不上什么插件啥的。

把替换表读进来。
把数据读进来。
查表替换。
输出结果。
完。
好的,我去试试。多谢了
您好,我用python尝试正则re.sub查找和替换,但是他总是报错【TypeError: 'Index' object is not callable】
以下是我用的python代码,麻烦您帮忙看看
import pandas as pd
import re
genelist=pd.read_excel("/mnt/f/MAGs/meishan7/downstram/MGIItree/test/gene1.xlsx")
from Bio import SeqIO
for seq in SeqIO.parse("/mnt/f/MAGs/meishan7/downstram/MGIItree/test/proteins.faa","fasta"):
seqid=seq.id
re.sub(r'\D',seqid,genelist.columns(seqid))
print(seqid)
附件
error.png
proteins.faa.png
gene1.xlsx.png
头像
lilydjwg
论坛版主
帖子: 4249
注册时间: 2009-04-11 23:46
系统: Arch Linux
联系:

Re: 把多个文件中的180条蛋白序列ID替换为物种编号

#7

帖子 lilydjwg » 2021-10-25 21:15

类型不对啦,re.sub 需要字符串类型。我也不了解 pandas 用的那些类型怎么转换。
建议你也先不要用 pandas,直接用 Python 自带的功能处理文本文件就好啦。(你大概可以把表格导出成 csv 再交给 Python 处理)
yhzii
帖子: 13
注册时间: 2021-08-23 21:23
系统: ubuntu20.4.2

Re: 把多个文件中的180条蛋白序列ID替换为物种编号

#8

帖子 yhzii » 2021-10-25 21:29

lilydjwg 写了: 2021-10-25 21:15 类型不对啦,re.sub 需要字符串类型。我也不了解 pandas 用的那些类型怎么转换。
建议你也先不要用 pandas,直接用 Python 自带的功能处理文本文件就好啦。(你大概可以把表格导出成 csv 再交给 Python 处理)
:Cry :Cry :Cry :Cry 还是谢谢大神了,我再学习学习,,真令人头秃呀 :Cry
头像
astolia
论坛版主
帖子: 6452
注册时间: 2008-09-18 13:11

Re: 把多个文件中的180条蛋白序列ID替换为物种编号

#9

帖子 astolia » 2021-10-26 12:36

yhzii 写了: 2021-10-21 15:21 我尝试了for循环里使用sed awk但都很难做到。 :Cry
只要思路清晰,用awk处理并不难

代码: 全选

for file in proteins_*.txt; do
    (tr -d '\r' < matrix.txt;echo "==matrixend==";cat "$file") | awk 'BEGIN{p=0;FS="\t"}{
        if ($0=="==matrixend==") {
            p=1
        }
        if (p==0) {
            for(i=1;i<=NF;i++) {
                a[NR,i]=$i
            }
            COLS=NF
        } else if(p==1) {
            for(c=1;c<=COLS;c++) {
                for(r=2;r<NR;r++) {
                    if (a[r,c]=="") {
                        continue
                    }
                    map[a[r,c]]=a[1,c]
                }
            }
            p=2
        } else {
            if ($0 ~ /^>/) {
                printf(">%s\n",map[substr($0,2)])
            } else {
                print($0)
            }
        }
    }' > "$(basename "$file")"_new.txt
done
基本思路就如同4楼说的。一个难点在于要处理两个文件,我这里用了一个小技巧,把两个文件合并成一个,中间用自定义的分隔行分隔,一起扔给awk处理。在最开始时,读入matrix.txt的内容,保存到二维数组中。遇到分隔行后,根据二维数组的内容构造出一个映射表。最后在处理proteins_*.txt时,根据映射查找表进行替换
yhzii
帖子: 13
注册时间: 2021-08-23 21:23
系统: ubuntu20.4.2

Re: 把多个文件中的180条蛋白序列ID替换为物种编号

#10

帖子 yhzii » 2021-10-26 18:45

astolia 写了: 2021-10-26 12:36
yhzii 写了: 2021-10-21 15:21 我尝试了for循环里使用sed awk但都很难做到。 :Cry
只要思路清晰,用awk处理并不难

代码: 全选

for file in proteins_*.txt; do
    (tr -d '\r' < matrix.txt;echo "==matrixend==";cat "$file") | awk 'BEGIN{p=0;FS="\t"}{
        if ($0=="==matrixend==") {
            p=1
        }
        if (p==0) {
            for(i=1;i<=NF;i++) {
                a[NR,i]=$i
            }
            COLS=NF
        } else if(p==1) {
            for(c=1;c<=COLS;c++) {
                for(r=2;r<NR;r++) {
                    if (a[r,c]=="") {
                        continue
                    }
                    map[a[r,c]]=a[1,c]
                }
            }
            p=2
        } else {
            if ($0 ~ /^>/) {
                printf(">%s\n",map[substr($0,2)])
            } else {
                print($0)
            }
        }
    }' > "$(basename "$file")"_new.txt
done
基本思路就如同4楼说的。一个难点在于要处理两个文件,我这里用了一个小技巧,把两个文件合并成一个,中间用自定义的分隔行分隔,一起扔给awk处理。在最开始时,读入matrix.txt的内容,保存到二维数组中。遇到分隔行后,根据二维数组的内容构造出一个映射表。最后在处理proteins_*.txt时,根据映射查找表进行替换
太厉害了!!!!!感谢大神,我也要好好学习了
回复