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

最初の 3 つのフィールドは、いくつかのテキスト パターンです。

今、私は次の両方を行う TCL でプログラムを書きたい:-

  1. ファイルに対して一意のソート「sort -u」を実行し、繰り返される行を削除し、O/P を新しいファイルにダンプします。
  2. 最初の 3 つのフィールドが同じ場合、数値が互いに 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 に答える