0

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

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 的那些行。

例如,满足这两个条件的上述文件的 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
    }
}
4

1 回答 1

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
于 2013-03-11T04:48:55.310 回答