2013-03-11 2 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. В случае, когда 1-ые три поля являются одинаковыми дампами, только те линии, где цифры больше 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

ответ

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

+0

Я внес некоторые изменения, чтобы лучше подобрать вам вопрос – Alec

+0

Что такое эквивалентная команда для dict для tcl 8.4 или ранее. «dict» i ssupported от tcl 8.5 и далее. Пожалуйста, измените сценарий для TCL 8.4 – user2095095