TCL-文件的uniq内容

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

我正在尝试对文件内容进行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 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) ""
    }

}