TCL对文件进行数学排序
我有一个包含多行的文件,如:-TCL对文件进行数学排序,tcl,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中编写一个程序,它可以执行以下两项:- 对文件执行唯一的排序“sort-u”&重新保存重复的行并将O/P转储到新文件中 对于前三个字段相同的情况,仅转储彼此之间的数字大于10
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中编写一个程序,它可以执行以下两项:-
A B A 10 20
A B A 35 45
C D A 10 15
A B Q 15 20
行的顺序在文件中并不重要
这不是一个聪明的解决方案,但很有效
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
看这个,这有助于你完成第(1)部分对不起,让我澄清一下。。我想在不同的行之间进行搜索,即从“ABA1020”开始,所以我们应该只转储“ABAAXY”中的行,其中x&y分别大于20和30。因此,数学搜索不是在同一行中,而是在不同的行之间。我做了一些修改,以便更好地匹配您的问题:对于tcl 8.4或更早版本,dict的等效命令是什么。我从TCL8.5开始支持“dict”。请修改TCL 8.4的脚本,请任何人帮助响应。这给了我一个不同的输出。我们在O/P中的某些行中看到了相同的x
A B A 10 20
A B A 35 45
A B Q 15 20
C D A 10 15