TCL通过3种不同的模式匹配删除重复行

TCL通过3种不同的模式匹配删除重复行,tcl,Tcl,我是TCL编程的初学者,希望从输入文件中删除行 完全相同的行内容 模式:“ghi\/\njkl\/\nrcc1”->“点\.*:10个汇”\. (单词“点”后面的数字和“[color.*”后面的内容可能不同-所有其他内容都需要精确匹配) “mno\/\npqr\/\nrcc1”->“stu\/\nvwx\/\nrcc1”[label=“depth:1”][color=salmon][fontcolor=salmon][style=solid]; (单词“点”后面的数字和“[color.*”后面的

我是TCL编程的初学者,希望从输入文件中删除行

  • 完全相同的行内容
  • 模式:
    “ghi\/\njkl\/\nrcc1”->“点\.*:10个汇”\.
    (单词“点”后面的数字和“
    [color.*
    ”后面的内容可能不同-所有其他内容都需要精确匹配)
  • “mno\/\npqr\/\nrcc1”->“stu\/\nvwx\/\nrcc1”[label=“depth:1”][color=salmon][fontcolor=salmon][style=solid];
    (单词“点”后面的数字和“
    [color.*
    ”后面的内容可能不同-所有其他内容都需要精确匹配)
  • 现在我有以下输入文件

    "abc\/\ndef\/\nrccu1" [shape=octagon,color=red,style=filled]; "abc\/\ndef\/\nrccu1" [shape=octagon,color=red,style=filled]; "ghi\/\njkl\/\nrccu1" -> "Point 1: 10 Sinks" [color=salmon] [style=solid] [weight=8]; "123\/\n456\/\nrccu1" -> "Point 9: 10 Sinks" [color=grey] [style=solid] [weight=8]; "ghi\/\njkl\/\nrccu1" -> "Point 8: 10 Sinks" [color=grey] [style=solid] [weight=8]; "ghi\/\njkl\/\nrccu1" -> "Point 13: 20 Sinks" [color=grey] [style=solid] [weight=8]; "mno\/\npqr\/\nrccu1" -> "stu\/\nvwx\/\nrccu1" [label = "depth: 1"] [color=salmon] [fontcolor=salmon] [style=solid]; "mno\/\npqr\/\nrccu1" -> "stu\/\nvwx\/\nrccu1" [label = "depth: 4"] [color=salmon] [fontcolor=salmon] [style=solid]; "mno\/\npqr\/\nrccu1" -> "stu\/\nvwx\/\nrccu1" [label = "depth: 1"] [color=grey] [fontcolor=red] [style=solid]; “abc\/\ndef\/\nrccu1”[形状=八角形,颜色=红色,样式=填充]; “abc\/\ndef\/\nrccu1”[形状=八角形,颜色=红色,样式=填充]; “ghi\/\njkl\/\nrcc1”->“第1点:10个水槽”[颜色=鲑鱼][风格=固体][重量=8]; “123\/\n456\/\nrcc1”->“第9点:10个水槽”[颜色=灰色][样式=实心][重量=8]; “ghi\/\njkl\/\nrcc1”->“第8点:10个水槽”[颜色=灰色][样式=实心][重量=8]; “ghi\/\njkl\/\nrcc1”->“第13点:20个水槽”[颜色=灰色][样式=实心][重量=8]; “mno\/\npqr\/\nrcc1”->“stu\/\nvwx\/\nrcc1”[label=“depth:1”][color=salmon][fontcolor=salmon][style=solid]; “mno\/\npqr\/\nrcc1”->“stu\/\nvwx\/\nrcc1”[label=“depth:4”][color=salmon][fontcolor=salmon][style=solid]; “mno\/\npqr\/\nrcc1”->“stu\/\nvwx\/\nrcc1”[label=“depth:1”][color=grey][fontcolor=red][style=solid]; 输出文件应包含:

    "abc\/\ndef\/\nrccu1" [shape=octagon,color=red,style=filled]; "ghi\/\njkl\/\nrccu1" -> "Point 1: 10 Sinks" [color=salmon] [style=solid] [weight=8]; "123\/\n456\/\nrccu1" -> "Point 9: 10 Sinks" [color=grey] [style=solid] [weight=8]; "ghi\/\njkl\/\nrccu1" -> "Point 13: 20 Sinks" [color=grey] [style=solid] [weight=8]; "mno\/\npqr\/\nrccu1" -> "stu\/\nvwx\/\nrccu1" [label = "depth: 1"] [color=salmon] [fontcolor=salmon] [style=solid]; "mno\/\npqr\/\nrccu1" -> "stu\/\nvwx\/\nrccu1" [label = "depth: 4"] [color=salmon] [fontcolor=salmon] [style=solid]; “abc\/\ndef\/\nrccu1”[形状=八角形,颜色=红色,样式=填充]; “ghi\/\njkl\/\nrcc1”->“第1点:10个水槽”[颜色=鲑鱼][风格=固体][重量=8]; “123\/\n456\/\nrcc1”->“第9点:10个水槽”[颜色=灰色][样式=实心][重量=8]; “ghi\/\njkl\/\nrcc1”->“第13点:20个水槽”[颜色=灰色][样式=实心][重量=8]; “mno\/\npqr\/\nrcc1”->“stu\/\nvwx\/\nrcc1”[label=“depth:1”][color=salmon][fontcolor=salmon][style=solid]; “mno\/\npqr\/\nrcc1”->“stu\/\nvwx\/\nrcc1”[label=“depth:4”][color=salmon][fontcolor=salmon][style=solid];
    你想用什么版本的Tcl来做这个?目前我正在使用Tcl版本“8.4”,所有的反斜杠都会出现在输入文件中吗?嗨,格伦,是的:(我想它们需要先被一个独特的字符串替换,比如“XXx\u XXx”,以便进行比较。为什么最后的“mno”会出现缺少行?属性
    fontcolor
    不同,因此输出中应显示行。缺少最后一行“mno”,因为“color”之前的字符串相同。感谢您提供代码-不幸的是,它在我的环境中不起作用-“dict”未知:(@Markus,更新为使用数组而不是dict。你需要更精确地说明你的要求:“颜色之前的字符串”根本不是你在问题中要求的。毕竟:“所有其他需要完全匹配”格伦:非常感谢你的帮助!我已经尝试过了,你的解决方案非常好!
    set in [open input.file r]
    array set seen {}
    while {[gets $in line] != -1} {
        # blank lines should be printed as-is
        if {[string length [string trim $line]] == 0} {
            puts $line
            continue
        }
    
        # create the "key" for this line
        regsub {\mPoint \d+} $line {} key
        regsub {\mcolor=\w+} $key {} key
    
        # print the line only if the key is unique
        if { ! [info exists seen($key)]} {
            puts $line
            set seen($key) true
        }
    }
    close $in