首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TCL中操作文件中的每一行

如何在TCL中操作文件中的每一行
EN

Stack Overflow用户
提问于 2012-02-25 06:02:12
回答 2查看 7.2K关注 0票数 0

我正在尝试写一些数据从iperf到一个文件使用tcl script.The文件有超过100行。现在我需要解析前10行,忽略它,考虑下一组10行并打印它,同样,我需要忽略下一组10行,打印下10行,并继续直到我到达文件的末尾。我如何才能在编程上做到这一点?

代码语言:javascript
复制
exec c:\\iperf_new\\iperf -c $REF_WLAN_IPAddr -f m -w 2M -i 1 -t $run_time  > xx.txt  

set fp [open "xx.txt" r ]
set file_data [read $fp]
set data [split $file_data "\n"]

foreach line $data {
    if {[regexp {(MBytes) +([0-9\.]*)} $line match pre tput]==1 } {
        puts "Throughput: $tput Mbps"
    }
EN

回答 2

Stack Overflow用户

发布于 2012-02-25 08:00:34

好的,如您的示例所示,您已经了解了如何将(slurped)文件拆分成行,并逐个处理它们。

现在实现“跳过十行,处理十行,跳过另外十行等等”有什么问题呢?它只是使用一个变量来计算到目前为止看到的行数,并根据它的值选择一个分支代码。当涉及到Tcl时,这种方法没有什么特别之处:可以使用命令进行计数、有条件地选择代码分支和控制循环。

如果基于行计数器的当前值的分支看起来太差劲了,您可以在该计数器变量周围实现一个state machine。但对于这个简单的例子,它看起来像是过度的工程。

另一种方法是使用lrangesplit返回的列表中选择所需的一系列行。这种方法可能使用lrange的一个很好的属性,它可以被告知返回子列表“从这个索引开始直到列表的末尾”,所以解决方案实际上可以归结为:

代码语言:javascript
复制
set lines [split [read $fd] \n]
parse_header [lrange $lines 0 9]
puts [join [lrange $lines 10 19] \n]
parse_something_else [lrange 20 29]
puts [join [lrange $lines 30 end] \n]

对于一个小文件来说,这个解决方案看起来非常紧凑和整洁。

票数 2
EN

Stack Overflow用户

发布于 2012-02-27 06:58:40

如果我没理解错的话,您希望打印11-20、31-40、51-60行...下面的代码将执行您想要的操作:

代码语言:javascript
复制
package require Tclx

set counter 0

for_file line xxx.txt {
    if {$counter % 20 >= 10} { puts $line }
    incr counter
}

Tclx包提供了一种从文件中读取行的简单方法:for_file命令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9438689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档