2017-04-18 5 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 
} 

期待される出力をファイル「ファイル名」を解凍し、変更されています。しかし、初めて実行すると、ファイルをダウンロードするだけで圧縮されません。私はそれを2回目に実行すると、期待される出力とオリジナルのダウンロードされたファイルの2番目のコピーを取得しました。

誰もがこれを手伝ってくれますか?私はafterとvwaitコマンドで試しましたが、うまくいきません。

ありがとうございました:)

答えて

0

を使用すると、エラーがスローされているかどうかを記述していないとして、それは(それが完了するまで実行しないようにするコードのための唯一の理由だろう)確かに言うのは難しいですが、私は」このようなものは正しいアプローチであることを期待dは:

まず
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ラインを停止する(ローカル)変数で複雑なビットを保っています。次に、すべてのサブプロセスを1つのパイプラインにまとめました。第3に、-q-O -wgetと、-cgunzipと使用しています。あなたがそれらを理解していない場合、彼らが何をするかを調べる。第4に、sedのスクリプトレットを中括弧に入れてバックスラッシュに問題が起きないようにしましたが、とバックスラッシュされていないセクションを使ってパターンを作っています。(それは直後に、少なくともいくつかのプラットフォームをバックスラッシュと改行シーケンスを必要とする...)


私は私のためにそれをやっていた場合は、データを抽出し、変換する実際使用ネイティブのTclコードをいただきたいが、それはかなり大きな変更です。

関連する問題