Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 优化问题:使用文件1中的字典转换文件2_Python_Bash_Optimization_Awk - Fatal编程技术网

Python 优化问题:使用文件1中的字典转换文件2

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(如果有生物信息学家经过,则为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+。基因识别号“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