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

How to find corresponding values in columns using TCL

我是一个普通的 matlab 用户,需要在 TCL 中做一些处理。我没有使用 tcl 的经验,所以到目前为止我所做的是通过搜索 google.

新手请见谅...

我在 A 列和 B 列中有数据是通过文件 Data_1 导入的,我想从 B 列中获取 A 列中两个数字的相应值,例如

当A为0.1则B为9,当A为0.3则B为21,将9和21存入变量以备后用

我想打开另一个文件 Data_2,它有两列 C 和 D。

我想将 D 列中 C 列中第 9 列和第 21 列(正数)之间的所有数字取平均值,然后将其放入变量中以备后用。

我首先尝试找到 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
# Open files for reading
set input1 [open "Data_1.dat" r]
set input2 [open "Data_2.dat" r]

#read file
set file_data [read $input1]
#close file
close $input1

#split into lines
set data [split $file_data "\n"]
foreach line $data {

set val1 [lsearch -inline $line 0.1]
set val2 [lsearch -inline $line 0.3]

puts $val1
puts $val2
}

我没有完全遵循您 post 中的所有 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]

这输出

180
162
144
126

备注:

  • 使用 while 循环遍历文件的行。
  • lassign 将列表的值赋给变量