如何使用TCL在列中查找相应的值
我是一个普通的matlab用户,需要在TCL中进行一些处理。我没有使用tcl的经验,所以到目前为止我所做的就是在谷歌上搜索 请原谅新手的方式 我有A列和B列中的数据,这些数据是通过文件数据_1导入的,我想从B列中获取A列中两个数字的相应值,例如 当A为0.1时,B为9;当A为0.3时,B为21,将9和21存储在变量中以供以后使用 我想打开另一个文件Data_2,它有两列C和d 我想取C列中第9列和第21列(正数)之间的d列的所有数字,求平均值,并将其放入变量中供以后使用 我首先尝试找到0.1和0.3的对应值,这就是我遇到的问题 我可以(我想)找到0.1和0.3,但不知道如何从B列中得到相应的值 然后继续第二部分 请帮忙如何使用TCL在列中查找相应的值,tcl,Tcl,我是一个普通的matlab用户,需要在TCL中进行一些处理。我没有使用tcl的经验,所以到目前为止我所做的就是在谷歌上搜索 请原谅新手的方式 我有A列和B列中的数据,这些数据是通过文件数据_1导入的,我想从B列中获取A列中两个数字的相应值,例如 当A为0.1时,B为9;当A为0.3时,B为21,将9和21存储在变量中以供以后使用 我想打开另一个文件Data_2,它有两列C和d 我想取C列中第9列和第21列(正数)之间的d列的所有数字,求平均值,并将其放入变量中供以后使用 我首先尝试找到0.1和0
Data_1 Data__2
Column A Column B Column C Column D
0 0 180 14.5
0.01 1.5 162 13.05
0.02 3 144 11.6
0.03 4.5 126 10.15
0.04 6 108 8.7
0.05 7.5 90 7.25
0.1 9 72 5.8
0.125 10.5 54 4.35
0.15 12 20 2.9
0.175 13.5 10 1.45
0.2 15 0 0
0.225 16.5 -10 -1.45
0.25 18 -20 -2.9
0.275 19.5 -54 -4.35
0.3 21 -72 -5.8
0.325 22.5 -90 -7.25
0.35 24 -108 -8.7
0.0.375 25.5 -126 -10.15
0.4 27 -144 -11.6
0.425 28.5 -162 -13.05
0.45 30 -180 -14.5
我没有完全遵循你文章中的if/else逻辑,但是有几种方法可以处理文件。从您的示例中,可以将A列和B列存储为两个单独的列表
set acol [list]
set bcol [list]
set data [split $file_data "\n"]
foreach line $data {
lappend acol [lindex $line 0]
lappend bcol [lindex $line 1]
}
# Find the first column A value that is 0.1.
set index [lsearch -real $acol 0.1]
# Get the corresponding B value.
puts "b value: [lindex $bcol $index]"
您也可以将foreach循环简化为这样,而无需将文件数据拆分为行
foreach {val1 val2} $file_data {
lappend acol $val1
lappend bcol $val2
}
我会这样写:
set min_key 0.1
set max_key 0.3
set fid [open Data_1.dat r]
while {[gets $fid line] != -1} {
lassign $line a b
if {$a == $min_key} {
set min $b
}
if {$a == $max_key} {
set max $b
}
}
close $fid
set fid [open Data_2.dat r]
while {[gets $fid line] != -1} {
lassign $line c d
if {$min <= $d && $d <= $max} {
lappend values $c
}
}
close $fid
puts [join $values \n]
注:
- 使用
循环迭代文件的行while
将列表的值分配给变量lassign
set min_key 0.1
set max_key 0.3
set fid [open Data_1.dat r]
while {[gets $fid line] != -1} {
lassign $line a b
if {$a == $min_key} {
set min $b
}
if {$a == $max_key} {
set max $b
}
}
close $fid
set fid [open Data_2.dat r]
while {[gets $fid line] != -1} {
lassign $line c d
if {$min <= $d && $d <= $max} {
lappend values $c
}
}
close $fid
puts [join $values \n]
180
162
144
126