我是新用的Tcl,我有以下脚本:
proc prepare_xml {pdb_id} {
set filename [exec wget ftp://ftp.ebi.ac.uk/pub/databases/msd/sifts/xml/$pdb_id.xml.gz]
set filename_unzip [exec gunzip "$pdb_id.xml.gz"]
set ready_xml [exec sed -i "/entry /c\<entry>" "$pdb_id.xml"]
return $ready_xml
}
预期输出是文件“filename”解压缩和修改。但是,当我第一次执行它时,它只下载文件并且不解压缩它。如果我第二次执行它,我获得了预期的输出和原始下载文件的第二个副本。
任何人都可以帮我吗?我尝试过after和vwait命令,但它不起作用。
谢谢:)
答案 0 :(得分:0)
很难说是肯定的,因为你没有描述是否抛出任何错误(这是代码无法完成的唯一原因),但我希望这样的事情是正确的的方法:
proc prepare_xml {pdb_id} {
# Double quotes on next line just because of Stack Overflow highlighter
set url "ftp://ftp.ebi.ac.uk/pub/databases/msd/sifts/xml/$pdb_id.xml.gz"
set file $pdb_id.xml
append sedcode {/entry /} "c\\\n" {<entry>}
exec wget -q -O - $url | gunzip -c | sed $sedcode > $file
return $file
}
首先,我在(本地)变量中保留复杂的位以阻止exec
行变得太长。其次,我将所有子进程放在一个管道中。第三,我将-q
和-O -
与wget
一起使用,-c
与gunzip
一起使用;如果你不理解他们,请查看他们做了什么。第四,我已经将sed
的scriptlet放在大括号中尽可能阻止反斜杠的麻烦,但是我使用了append
和一个非反斜杠的部分来制作模式,因为语法sed中的c
是彻头彻尾的奇怪(它至少在某些平台之后需要一个反斜杠换行序列......)
我实际使用本机Tcl代码来提取和转换数据,如果我是为我做的那样,但这是一个相当大的变化。