gpt4 book ai didi

linux - tcl 命令在 linux 中搜索 txt 文件中的特定单词

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:09:30 25 4
gpt4 key购买 nike

我需要编写一个 tcl 脚本来处理文本文件的行。该文件看起来像

10.77.33.247    10.77.33.241        rtp 0x26
10.77.33.247 10.77.33.241 rtp 0x26
10.77.33.247 10.77.33.241 rtp 0x26
10.77.33.247 10.77.33.241 0x24
10.77.33.247 10.77.33.241 0x22
10.77.33.247 10.77.33.241 0x21

我需要能够遍历文件并为包含 rtp 的每一行存储其后的值(例如,上面示例中的 0x26)在一个变量中用于脚本的其他部分。

最佳答案

这是一种(相当低级的)Tcl 方法。

set ch [open myfile.txt]
set data [chan read $ch]
chan close $ch

set lines [split [string trim $data] \n]

set res {}
foreach line $lines {
if {[llength $line] > 3 && [lindex $line 2] eq {rtp}} {
lappend res [lindex $line 3]
}
}

如果您将“myfile.txt”替换为您的数据文件的名称并运行此代码,您将在变量 res 中获得收集后的单词。


说明

通常最好使用标准(内置或 tcllib)命令,例如 glenn jackman 的回答中的 fileutil::foreachLine。但是,如果想一步一步地完成,Tcl 仍然非常容易。

第一步是将文件内容读入内存。也有一个标准的命令:fileutil::cat,但是下面的序列就可以了:

set ch [open myfile.txt]
set data [chan read $ch]
chan close $ch

(这或多或少等同于set data [fileutil::cat myfile.txt]。)

下一步是将文本拆分成行。剪掉文本两端的空格始终是个好主意,否则松散的换行符会创建干扰处理的空元素。

set lines [split [string trim $data] \n]

在某些情况下,我们可能不得不将行拆分为字段列表,但从示例来看,这些行似乎已经可以用作列表(只有空格、字母数字和良好的标点符号(如点)的行通常是)。

我们需要对匹配行进行测试。有几种适合您提供的示例数据的备选方案,包括

string match *rtp* $line  ;# match every line that has "rtp" somewhere
[llength $line] > 3 ;# match every line that has more than three columns
[lindex $line 2] eq {rtp} ;# match every line where the third element is "rtp"

我们还需要一种方法来提取我们想要的数据。如果“rtp”之后的词总是在最后一列,[lindex $line end] 将完成这项工作。如果单词总是在第四列,但可能还有更多的列,[lindex $line 3] 更好。

捕获其中几个选项,可以编写获取指定单词列表的过程

set res {}
foreach line $lines {
if {[llength $line] > 3 && [lindex $line 2] eq {rtp}} {
lappend res [lindex $line 3]
}
}

(在伪代码中:获取一个空列表(res);测试每一行(使用上面两个测试的组合),从每个匹配行中提取所需的单词,然后将其添加到 res 列表。)

或者,使用 lmap (Tcl 8.6+)

set res [lmap line $lines {
if {[llength $line] > 3 && [lindex $line 2] eq {rtp}} {
lindex $line 3
} else {
continue
}
}]

“rtp”之后的所有单词现在都应该在 res 中。如果您只想要最后一场比赛,那就是 [lindex $res end]

文档:chan , continue , foreach , if , lappend , lindex , llength , lmap , open , set , split , string

关于linux - tcl 命令在 linux 中搜索 txt 文件中的特定单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30076562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com