TCL-文件的uniq内容
我正在尝试对文件内容进行uniquify。比赛和比分有时会重复,我正试着写信给file1 输入:TCL-文件的uniq内容,tcl,Tcl,我正在尝试对文件内容进行uniquify。比赛和比分有时会重复,我正试着写信给file1 输入: game score a 1 a 1 a 2 b 1 b 2 b 2 输出: Uniq1 a 1 Uniq2 a 2 Uniq3 b 1 Uniq4 b 2 代码: 只需将这些行作为键存储在dict中,并在读取所有输入后迭代这些键,以打印值(按它们在输入中出现的顺序),而不包括重复项。例如: #!/usr/bin/env tclsh proc main {} { # Discard h
game score
a 1
a 1
a 2
b 1
b 2
b 2
输出:
Uniq1 a 1
Uniq2 a 2
Uniq3 b 1
Uniq4 b 2
代码:
只需将这些行作为键存储在
dict
中,并在读取所有输入后迭代这些键,以打印值(按它们在输入中出现的顺序),而不包括重复项。例如:
#!/usr/bin/env tclsh
proc main {} {
# Discard header line
gets stdin
while {[gets stdin line] > 0} {
dict set lines $line 1
}
set i 1
dict for {line _} $lines {
puts "Uniq$i $line"
incr i
}
}
main
运行此命令将产生:
Uniq1 a 1
Uniq2 a 2
Uniq3 b 1
Uniq4 b 2
我认为有几个选择,取决于复杂性。例如,如果重复总是一个接一个地出现,那么我只会将当前行保存为前一行,当我到达下一行时,我会将其与前一行进行比较:
set previous(g1) ""
set previous(g2) ""
while {[gets $inputfile] > 0} {
set g1 [lindex $token end]
set g2 [lindex $token end-1]
if {$previous(g1) != $g1 && $previous(g2) != $g2} {
incr gcount
puts $file1 "Uniq$gcount $g1 $g2"
set previous(g1) $g1
set previous(g2) $g2
}
}
如果复制可能发生在任何地方,那么我会这样做:
array set previous {}
while {[gets $inputfile] > 0} {
set g1 [lindex $token end]
set g2 [lindex $token end-1]
if {![info exists previous($g1,$g2)]} {
incr gcount
puts $file1 "Uniq$gcount $g1 $g2"
set previous($g1,$g2) ""
}
}
我已经有了使用lindex来获取第1列和第2列的代码?那么,我如何将上述建议用于LINDEX?也许dict不适合我?我测试了建议的代码,但没有生成您所拥有的内容?@jay我将您的示例输入复制并粘贴到一个文件中,并将其输入到我发布的tcl代码中(
tclsh demo.tcl
)。对您来说会发生什么?不幸的是,它没有给出任何输出。您是在尝试在整个文件中执行唯一的行,还是只是合并相同行的运行?
array set previous {}
while {[gets $inputfile] > 0} {
set g1 [lindex $token end]
set g2 [lindex $token end-1]
if {![info exists previous($g1,$g2)]} {
incr gcount
puts $file1 "Uniq$gcount $g1 $g2"
set previous($g1,$g2) ""
}
}