2013-03-11 54 views
0

我有有多條線路像一個文件: -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 

前三的Fileds一些文本模式。

現在我想要寫在TCL一個程序做以下兩項: -

  1. 做了獨特的排序「排序-u」爲文件& reoves重複線&轉儲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 
    } 
} 
+0

看看這個[需要排序-u做。需要使用TCL](http://stackoverflow.com/questions/15215600/tcl-sort-a-file),它可以幫助你與部分(1) – static 2013-03-11 02:45:47

回答

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 
+0

對不起..我明白自己..我想做在不同的行之間進行搜索,即從「ABA 10 20」開始搜索,所以我們只應該在「ABA xy」中分別放置一行,其中x&y分別大於20和30。所以數學搜索不在同一條線上,而是跨越線條。 – user2095095 2013-03-12 02:43:36

+0

我做了一些修改以更好地匹配你的問題 – Alec 2013-03-12 12:38:24

+0

tcl 8.4或之前的dict的等效命令是什麼。 「tict」從tcl 8.5開始支持。請修改腳本TCL 8.4 – user2095095 2013-03-13 07:21:59