Python 优化问题:使用文件1中的字典转换文件2
我正在尝试转换文件1(如果有生物信息学家经过,则为gtf文件),其行如下:Python 优化问题:使用文件1中的字典转换文件2,python,bash,optimization,awk,Python,Bash,Optimization,Awk,我正在尝试转换文件1(如果有生物信息学家经过,则为gtf文件),其行如下: 1 X外显子1 300000 1000-。基因识别号“Z.633”;抄本“Z.633.mrna1”;外显子_编号“1”; 1份成绩单1 300000 1000-。基因识别号“Z.633”;抄本“Z.633.mrna1”; 1个外显子300005 300500 1000-。基因识别号“Y.6330”;成绩单编号“Y.6330.mrna1”;外显子_编号“2”; 1个外显子300500 310000 1000+。基因识别号“
1 X外显子1 300000 1000-。基因识别号“Z.633”;抄本“Z.633.mrna1”;外显子_编号“1”;
1份成绩单1 300000 1000-。基因识别号“Z.633”;抄本“Z.633.mrna1”;
1个外显子300005 300500 1000-。基因识别号“Y.6330”;成绩单编号“Y.6330.mrna1”;外显子_编号“2”;
1个外显子300500 310000 1000+。基因识别号“Y.6330”;成绩单编号“Y.6330.mrna1”;外显子_编号“1”;
1份成绩单30005310000 1000+。基因识别号“Y.6330”;成绩单编号“Y.6330.mrna1”;
将所有“Z”替换为“F”和其他对应项的文件。所有对应项都在我用作字典的文件2中,第1列是键,第2列是值
示例文件2:
Z.633 F.633
Y.6330 U.6330
示例结果:
1 X外显子1 300000 1000-。基因识别号“F.633”;转录本“F.633.mrna1”;外显子_编号“1”;
1份成绩单1 300000 1000-。基因识别号“F.633”;转录本“F.633.mrna1”;
1个外显子300005 300500 1000-。基因识别号“U.6330”;成绩单“U.6330.mrna1”;外显子_编号“2”;
1个外显子300500 310000 1000+。基因识别号“U.6330”;成绩单“U.6330.mrna1”;外显子_编号“1”;
1份成绩单30005310000 1000+。基因识别号“U.6330”;成绩单“U.6330.mrna1”;
file1大约有200000行,file2有20000行
为此,我使用了一个awk脚本:
NR == FNR {
rep[ $2 ] = $1
next
}
{
for (key in rep)
gsub(key, rep[key])
print
}
然后:
awk-f dict.awk file2 file1>newfile
我的问题是脚本实际上运行了几天。。。我有什么办法可以改进吗?
有没有更适合这个问题的编程语言?(我尝试了python,但运行时间更糟)
(使用的python脚本:)
我可以告诉你,这并不是字典部分需要这么长时间,因为我用一个较小的文件1测试了它,它运行得很快…假设每个记录只有一个
gene\u id
要替换,它总是可以在第10列找到,就像在你的示例文件中一样,你可以找到它并调用gsub
一次,而不是每个记录调用20K函数
> cat tst.awk
NR==FNR {
r[$1] = $2
next
}
{
x = $10
gsub(/"|;/, "", x)
gsub(x, r[x])
print
}
假设每个记录只有一个要替换的
gene\u id
,它总是可以在第10列找到,就像在示例文件中一样,您可以找到它并调用gsub
一次,而不是每个记录调用20K函数
> cat tst.awk
NR==FNR {
r[$1] = $2
next
}
{
x = $10
gsub(/"|;/, "", x)
gsub(x, r[x])
print
}
awk -f tst.awk file2 file1