预期脚本:运行两个名称相似的文件



我正在尝试使用和期望脚本来自动运行程序,但我做错了什么。我在当前目录中有一堆文件遵循以下命名约定:

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)
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
# ...
}

我认为您混淆了bash和Tcl/Expect表示法。

Expect是Tcl的一个扩展,所以如果您要让Expect解释您的脚本,您需要使用Tcl的构造。

对于初学者,您将需要使用Tcl的"For"循环,这里有文档记录。

有关所需的其他条件(if、while等),请参阅Tcl文档的其余部分。

相关内容

  • 没有找到相关文章

最新更新