2014-02-26 100 views
0

我試圖自動運行程序,使用和期望腳本,但我做錯了什麼。 我有一大堆的文件在遵循這個命名約定我的當前目錄:Expect腳本:運行兩個具有相似名稱的文件

file_name-hereROI.txt 
file_name-hereFR.txt 
file1_name-hereROI.txt 
file1_name-hereFR.txt 
file_name1-hereROI.txt 
file_name1-hereFR.txt 
file_name-here1ROI.txt 
file_name-here1FR.txt 

我想這樣做是爲了在每對運行程序。因此,如果「ROI」或「FR」之前的字符串相同,則應該用水比較。 我已經寫:

1 #/usr/bin/expect 
    2 for f in *ROI.fasta 
    3 do 
    4 for f2 in *FR.fasta 
    5 do 
    6  fROI=$(echo $f | cut -d'ROI' -f 1) 
    7  f2ROI=$(echo $f2 | cut -d'FR' -f 1) 
    8  if [$fROI == $f2ROI] 
    9  then 
10  spawn water f f2 
11  expect "Gap opening penalty [10.0]:" 
12  send "\n" 
13  expect "Gap extension penalty [0.5]:" 
14  send "\n" 
15  expect "Output alignment" 
16  send "\n" 
17  close 
18  fi 
19 done < ls 
20 done < ls 

但我沒有得到很遠的。我有這個錯誤:

$ expect water.sh 
wrong # args: should be "for start test next command" 
    while executing 
"for f in *ROI.fasta" 
    (file "water.sh" line 2) 

回答

1
foreach f [glob *ROI.txt] { 
    set f2 "[string range $f 0 [expr {[string length $f] - 8}]]FR.txt" 
    if {[file exists $f2]} { 
     spawn water $f $f2 
     # ... 
    } 
} 

爲了避免硬編碼數字 「8」

set suffix "ROI.txt" 
set new_suffix "FR.txt" 
foreach f [glob *$suffix] { 
    set prefix [regsub "$suffix\$" $f ""] 
    # or 
    set idx [string last $suffix $f] 
    set prefix [string range $f 0 [incr idx -1]] 

    set f2 $prefix$new_suffix 
    # ... 
} 
+0

如果我想把-8改成-10,我怎麼能這樣做?在bash中你必須使用特殊的括號。 – Stephopolis

1

我想你在bash和Tcl/Expect之間混合起來。

Expect是Tcl的擴展,所以如果你打算讓你的腳本被Expect解釋,你需要使用Tcl的構造。

對於初學者,您需要使用Tcl的「for」循環,documented here

請參閱其餘條件所需的Tcl文檔(如果,而等)。

+1

的[Tcl的教程](http://tcl.tk/man/tcl8.5/tutorial/tcltutorial.html)是一個很好資源。 –

相關問題