TCL以数学方式对文件进行排序

时间:2013-03-11 02:40:01

标签: 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编写一个程序,其中包含以下内容: -

  1. 对文件&进行独特排序“sort -u”重复重复的线条&将O / P转储到新文件中。
  2. 对于前三个字段相同的情况,仅转储那些数字大于10的行。
  3. 例如,满足两个条件的上述文件的O / P将是: -

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

    行的顺序在文件中并不重要。


    ##Changed the program
    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 a [ lreplace valuelist $index $index [lrange $data 3 4]]
    
          set valuelist $a
    
        } else {
            lappend keylist $key
            lappend valuelist [lrange $data 3 4]
            puts $line
        }
    }
    

1 个答案:

答案 0 :(得分:0)

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

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