如何从给定文件中对TCL进行排序?

时间:2016-10-31 18:00:53

标签: tcl

我在使用TCL排序时遇到问题,我无法将参考示例放入我的。

我的文件包含两列name& area,如何按区域排序而不更改相应的名称?

我正在试用foreach&关联数组但到目前为止我无法这样做...

LSDNENCLSSXl_HVT    2.2872
LSDNENCLSSX2_HVT    2.5414
LSDNENCLSSX4_HVT    3.0497
LSDNENCLSSX8_HVT    4.0663
LSDNENCLX1_HVT  7.116032
LSDNENCLX2_HVT  7.62432
LSDNENCLX4_HVT  8.640896
LSDNENCLX8_HVT  11.18233
LSDNENSSXl_HVT  4.320448
LSDNENSSX2_HVT  5.08288
LSDNENSSX4_HVT  5.591168
LSDNENSSX8_HVT  7.370176
LSDNENXl_HVT    7.116032
LSDNENX2_HVT    7.62432
LSDNENX4_HVT    8.640896
LSDNENX8_HVT    11.182336
LSDNSSXl_HVT    1.779008
LSDNSSX2_HVT    2.033152
LSDNSSX4_HVT    2.54144
LSDNSSX8_HVT    4.320448
LSDNXl_HVT  7.116032
LSDNX2_HVT  7.116032
LSDNX4_HVT  7.116032
LSDNX8_HVT  9.149184

任何帮助将不胜感激......

2 个答案:

答案 0 :(得分:0)

set fh [open "filename"]
set data [read $fh]
close $fh
set words [regexp -all -inline {\S+} $data]

foreach {name area} [lsort -stride 2 -index 1 -real $words] {
    puts "$name\t$area"
}

请参阅lsort文档。

输出

LSDNSSXl_HVT    1.779008
LSDNSSX2_HVT    2.033152
LSDNENCLSSXl_HVT    2.2872
LSDNENCLSSX2_HVT    2.5414
LSDNSSX4_HVT    2.54144
LSDNENCLSSX4_HVT    3.0497
LSDNENCLSSX8_HVT    4.0663
LSDNENSSXl_HVT  4.320448
LSDNSSX8_HVT    4.320448
LSDNENSSX2_HVT  5.08288
LSDNENSSX4_HVT  5.591168
LSDNENCLX1_HVT  7.116032
LSDNENXl_HVT    7.116032
LSDNXl_HVT  7.116032
LSDNX2_HVT  7.116032
LSDNX4_HVT  7.116032
LSDNENSSX8_HVT  7.370176
LSDNENCLX2_HVT  7.62432
LSDNENX2_HVT    7.62432
LSDNENCLX4_HVT  8.640896
LSDNENX4_HVT    8.640896
LSDNX8_HVT  9.149184
LSDNENCLX8_HVT  11.18233
LSDNENX8_HVT    11.182336

答案 1 :(得分:0)

-stride是Tcl 8.6中添加的一项功能,所以我猜您使用的是Tcl 8.5或更早版本。

此外,评论中的代码看起来并不合适。有几件事看起来不对劲。你需要将一个列表传递给array set以获得一个数组,并且数组没有排序,所以我会放弃它。我会建议这样的事情:

set fh [open "result_table_sort" r]
set data [read $fh]
close $fh
set lines [split $data "\n"]               ;# Use the appropriate EOL character
                                            # if it's different
set result [lsort -real -index 1 $lines]
puts $result

以上假设文件result_table_sort结构合理,并且不包含任何未按照提供的示例中所述格式化/结构化的内容。