TCL对文件进行数学排序

TCL对文件进行数学排序,tcl,Tcl,我有一个包含多行的文件,如:- A B A 10 20 A B A 10 20 C D A 10 15 A B Q 15 20 A B A 35 45 A B A 15 20 C D A 10 15 A B A 20 25 . . . A A A x1 y1 前三个文件是一些文本模式 现在我想在TCL中编写一个程序,它可以执行以下两项:- 对文件执行唯一的排序“sort-u”&重新保存重复的行并将O/P转储到新文件中 对于前三个字段相同的情况,仅转储彼此之间的数字大于10

我有一个包含多行的文件,如:-

A B A 10 20

A B A 10 20

C D A 10 15

A B Q 15 20

A B A 35 45

A B A 15 20

C D A 10 15

A B A 20 25

.

.

.

A A A x1 y1
前三个文件是一些文本模式

现在我想在TCL中编写一个程序,它可以执行以下两项:-

  • 对文件执行唯一的排序“sort-u”&重新保存重复的行并将O/P转储到新文件中
  • 对于前三个字段相同的情况,仅转储彼此之间的数字大于10的行
  • 对于eg,满足这两个条件的上述文件的O/p为:-

    A B A 10 20
    
    A B A 35 45
    
    C D A 10 15
    
    A B Q 15 20
    
    行的顺序在文件中并不重要



    这不是一个聪明的解决方案,但很有效

    set input [open "data.txt" "r"]
    set content [read $input]
    set lines [lsort -unique [split $content "\n"]]
    set keylist ""
    set valuelist ""
    
    foreach line $lines {
        if {$line == ""} { continue }
        set data [split $line " "]
        set key [join [lrange $data 0 2] "_"]
        set index [lsearch $keylist $key]
    
        if {$index != -1} {
            set value [lindex $valuelist $index]
    
            set diff_a [expr [lindex $data 3] - [lindex $value 0]]
            set diff_b [expr [lindex $data 4] - [lindex $value 1]]
    
            if {$diff_a > 10 && $diff_b > 10 } {
                puts $line
            }
    
            set valuelist [lreplace valuelist $index $index [lrange $data 3 4]]
        } else {
            lappend keylist $key
            lappend valuelist [lrange $data 3 4]
            puts $line
        }
    }
    
    输出:

    A B A 10 20
    A B A 35 45
    A B Q 15 20
    C D A 10 15
    

    看这个,这有助于你完成第(1)部分对不起,让我澄清一下。。我想在不同的行之间进行搜索,即从“ABA1020”开始,所以我们应该只转储“ABAAXY”中的行,其中x&y分别大于20和30。因此,数学搜索不是在同一行中,而是在不同的行之间。我做了一些修改,以便更好地匹配您的问题:对于tcl 8.4或更早版本,dict的等效命令是什么。我从TCL8.5开始支持“dict”。请修改TCL 8.4的脚本,请任何人帮助响应。这给了我一个不同的输出。我们在O/P中的某些行中看到了相同的x
    A B A 10 20
    A B A 35 45
    A B Q 15 20
    C D A 10 15