2017-04-18 41 views
0

我是新使用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 
} 

預期的輸出是文件「文件名」解壓縮和修改。但是,當我第一次執行它時,它只會下載該文件,而不會對其進行解壓縮。如果我第二次執行它,我獲得了預期的輸出和原始下載文件的第二個副本。

任何人都可以幫助我嗎?我嘗試過使用後和vwait命令,但它不起作用。

謝謝:)

回答

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代碼提取和轉換數據,如果我這樣做是爲了我,但這是一個相當大的變化。

相關問題