如何在同一个tcl脚本中下载然后使用该文件?

时间:2017-04-18 09:28:39

标签: tcl

我是新用的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命令,但它不起作用。

谢谢:)

1 个答案:

答案 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一起使用,-cgunzip一起使用;如果你不理解他们,请查看他们做了什么。第四,我已经将sed的scriptlet放在大括号中尽可能阻止反斜杠的麻烦,但是我使用了append和一个非反斜杠的部分来制作模式,因为语法sed中的c彻头彻尾的奇怪(它至少在某些平台之后需要一个反斜杠换行序列......)

实际使用本机Tcl代码来提取和转换数据,如果我是为我做的那样,但这是一个相当大的变化。