如何使用TCL在列中查找相应的值

如何使用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

我是一个普通的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列中得到相应的值

然后继续第二部分

请帮忙

     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
    将列表的值分配给变量

学习Tcl的最佳起点是感谢Glenn,你的例子正是我想要的。
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