把多个文件中的180条蛋白序列ID替换为物种编号
-
- 帖子: 13
- 注册时间: 2021-08-23 21:23
- 系统: ubuntu20.4.2
把多个文件中的180条蛋白序列ID替换为物种编号
请问大家,
我有100个蛋白序列文件,每个蛋白序列文件中包含约180条蛋白序列,需要把每条序列ID替换为对应的物种编号;序列ID和物种编号的对应关系在另一个矩阵文件(matrix.txt)中存储,矩阵中的列名即为物种编号,每个单元格是序列ID,一个物种中包含很多条序列。请问代码应当如何编写?
我尝试了for循环里使用sed awk但都很难做到。
希望大佬们帮我指点一下。拜托啦
附件是待替换的蛋白序列文件和物种编号矩阵。
我有100个蛋白序列文件,每个蛋白序列文件中包含约180条蛋白序列,需要把每条序列ID替换为对应的物种编号;序列ID和物种编号的对应关系在另一个矩阵文件(matrix.txt)中存储,矩阵中的列名即为物种编号,每个单元格是序列ID,一个物种中包含很多条序列。请问代码应当如何编写?
我尝试了for循环里使用sed awk但都很难做到。
希望大佬们帮我指点一下。拜托啦
附件是待替换的蛋白序列文件和物种编号矩阵。
- 附件
-
- proteins_seqID_PF00466-Ribosomal_L10.HMM1.txt
- (53.36 KiB) 已下载 93 次
-
- matrix.txt
- (15.05 KiB) 已下载 100 次
- lilydjwg
- 论坛版主
- 帖子: 4249
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 把多个文件中的180条蛋白序列ID替换为物种编号
要是我就用 Python 写了,有这个提问的时间,我的 Python 脚本都写好了……
shell 脚本不擅长比较精细的处理。
shell 脚本不擅长比较精细的处理。
-
- 帖子: 13
- 注册时间: 2021-08-23 21:23
- 系统: ubuntu20.4.2
- lilydjwg
- 论坛版主
- 帖子: 4249
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 把多个文件中的180条蛋白序列ID替换为物种编号
你会什么语言就用什么语言呀。(都不会的话建议学一下 Python)
用不上什么插件啥的。
把替换表读进来。
把数据读进来。
查表替换。
输出结果。
完。
-
- 帖子: 13
- 注册时间: 2021-08-23 21:23
- 系统: ubuntu20.4.2
-
- 帖子: 13
- 注册时间: 2021-08-23 21:23
- 系统: ubuntu20.4.2
Re: 把多个文件中的180条蛋白序列ID替换为物种编号
您好,我用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)
- lilydjwg
- 论坛版主
- 帖子: 4249
- 注册时间: 2009-04-11 23:46
- 系统: Arch Linux
- 联系:
Re: 把多个文件中的180条蛋白序列ID替换为物种编号
类型不对啦,re.sub 需要字符串类型。我也不了解 pandas 用的那些类型怎么转换。
建议你也先不要用 pandas,直接用 Python 自带的功能处理文本文件就好啦。(你大概可以把表格导出成 csv 再交给 Python 处理)
建议你也先不要用 pandas,直接用 Python 自带的功能处理文本文件就好啦。(你大概可以把表格导出成 csv 再交给 Python 处理)
-
- 帖子: 13
- 注册时间: 2021-08-23 21:23
- 系统: ubuntu20.4.2
- astolia
- 论坛版主
- 帖子: 6450
- 注册时间: 2008-09-18 13:11
Re: 把多个文件中的180条蛋白序列ID替换为物种编号
只要思路清晰,用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
-
- 帖子: 13
- 注册时间: 2021-08-23 21:23
- 系统: ubuntu20.4.2
Re: 把多个文件中的180条蛋白序列ID替换为物种编号
太厉害了!!!!!感谢大神,我也要好好学习了astolia 写了: ↑2021-10-26 12:36只要思路清晰,用awk处理并不难基本思路就如同4楼说的。一个难点在于要处理两个文件,我这里用了一个小技巧,把两个文件合并成一个,中间用自定义的分隔行分隔,一起扔给awk处理。在最开始时,读入matrix.txt的内容,保存到二维数组中。遇到分隔行后,根据二维数组的内容构造出一个映射表。最后在处理proteins_*.txt时,根据映射查找表进行替换代码: 全选
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