我正在尝试写一些数据从iperf到一个文件使用tcl script.The文件有超过100行。现在我需要解析前10行,忽略它,考虑下一组10行并打印它,同样,我需要忽略下一组10行,打印下10行,并继续直到我到达文件的末尾。我如何才能在编程上做到这一点?
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"
}发布于 2012-02-25 08:00:34
好的,如您的示例所示,您已经了解了如何将(slurped)文件拆分成行,并逐个处理它们。
现在实现“跳过十行,处理十行,跳过另外十行等等”有什么问题呢?它只是使用一个变量来计算到目前为止看到的行数,并根据它的值选择一个分支代码。当涉及到Tcl时,这种方法没有什么特别之处:可以使用命令进行计数、有条件地选择代码分支和控制循环。
如果基于行计数器的当前值的分支看起来太差劲了,您可以在该计数器变量周围实现一个state machine。但对于这个简单的例子,它看起来像是过度的工程。
另一种方法是使用lrange从split返回的列表中选择所需的一系列行。这种方法可能使用lrange的一个很好的属性,它可以被告知返回子列表“从这个索引开始直到列表的末尾”,所以解决方案实际上可以归结为:
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]对于一个小文件来说,这个解决方案看起来非常紧凑和整洁。
发布于 2012-02-27 06:58:40
如果我没理解错的话,您希望打印11-20、31-40、51-60行...下面的代码将执行您想要的操作:
package require Tclx
set counter 0
for_file line xxx.txt {
if {$counter % 20 >= 10} { puts $line }
incr counter
}Tclx包提供了一种从文件中读取行的简单方法:for_file命令。
https://stackoverflow.com/questions/9438689
复制相似问题