Tcl代码修正:3M数据文件重复条目筛选(保留高亮最小值)
技术问询
我有一个大小为3M的sample_data.tcl文件,数据格式如下(每条记录包含路径行、数据行,空行分隔):
i_top/i_module_wrapper_top_0/i_module_dbe_top_0/i_ctrl_top/u_mcu_system/u_ibex_top/gen_rams_gen_rams_inner_0__gen_noscramble_rams_data_bank/gen_generic_u_impl_generic/mem_reg_60__11_ **0.777900(5.709091%)** 0.799630(3.05152%) 0.021730(2.633939%) i_top/i_module_wrapper_top_0/i_module_dbe_top_0/i_ctrl_top/u_mcu_system/u_ibex_top/gen_rams_gen_rams_inner_0__gen_noscramble_rams_data_bank/gen_generic_u_impl_generic/mem_reg_58__11_ **0.97870(6.076364%)** 0.79990(3.033939%) 0.021800(2.64424%) i_top/i_module_wrapper_top_0/i_module_dbe_top_0/i_ctrl_top/u_mcu_system/u_ibex_top/gen_rams_gen_rams_inner_1__gen_noscramble_rams_data_bank/gen_generic_u_impl_generic/mem_reg_1__44_ **0.778180(5.675152%)** 0.798220(3.246061%) 0.020040(2.429091%) i_top/i_module_wrapper_top_0/i_module_dbe_top_0/i_ctrl_top/u_mcu_system/u_ibex_top/gen_rams_gen_rams_inner_0__gen_noscramble_rams_data_bank/gen_generic_u_impl_generic/mem_reg_58__11_ **0.77870(5.676364%)** 0.79990(3.033939%) 0.021800(2.64424%) i_top/i_module_wrapper_top_0/i_module_dbe_top_1/i_tx_top/i_csr/i_reg/txdatgen_seed_udp_reg3_io3_nt_q_reg_20_ **0.777320(5.779394%)** 0.803050(2.660606%) 0.025730(3.118788%) i_top/i_module_wrapper_top_0/i_module_dbe_top_0/i_ctrl_top/u_mcu_system/u_ibex_top/gen_rams_gen_rams_inner_1__gen_noscramble_rams_data_bank/gen_generic_u_impl_generic/mem_reg_1__22_ ** 0.777720(5.730909%)** 0.797750(3.303030%) 0.020030(2.427879%)
需求:对比文件中的记录,若存在相同路径的记录,比较其高亮的数值(括号前的浮点数),将数值更小的记录写入输出文件;若路径唯一,则直接写入输出文件。预期输出如下:
i_top/i_module_wrapper_top_0/i_module_dbe_top_0/i_ctrl_top/u_mcu_system/u_ibex_top/gen_rams_gen_rams_inner_0__gen_noscramble_rams_data_bank/gen_generic_u_impl_generic/mem_reg_60__11_ **0.777900(5.709091%)** 0.799630(3.05152%) 0.021730(2.633939%) i_top/i_module_wrapper_top_0/i_module_dbe_top_0/i_ctrl_top/u_mcu_system/u_ibex_top/gen_rams_gen_rams_inner_1__gen_noscramble_rams_data_bank/gen_generic_u_impl_generic/mem_reg_1__44_ **0.778180(5.675152%)** 0.798220(3.246061%) 0.020040(2.429091%) i_top/i_module_wrapper_top_0/i_module_dbe_top_0/i_ctrl_top/u_mcu_system/u_ibex_top/gen_rams_gen_rams_inner_0__gen_noscramble_rams_data_bank/gen_generic_u_impl_generic/mem_reg_58__11_ **0.77870(5.676364%)** 0.79990(3.033939%) 0.021800(2.64424%) i_top/i_module_wrapper_top_0/i_module_dbe_top_1/i_tx_top/i_csr/i_reg/txdatgen_seed_udp_reg3_io3_nt_q_reg_20_ **0.777320(5.779394%)** 0.803050(2.660606%) 0.025730(3.118788%) i_top/i_module_wrapper_top_0/i_module_dbe_top_0/i_ctrl_top/u_mcu_system/u_ibex_top/gen_rams_gen_rams_inner_1__gen_noscramble_rams_data_bank/gen_generic_u_impl_generic/mem_reg_1__22_ ** 0.777720(5.730909%)** 0.797750(3.303030%) 0.020030(2.427879%)
我自行编写了以下Tcl代码,但未得到正确结果,请求修正方案:
set inputFile [open $input_def r] set outputFile [open $output_filename w+] set lineNumber 0 set skipLines 0 while {[gets $inputFile line] >= 0} { incr lineNumber if {($lineNumber % 3) == 1} { # Extract the first word until the first tab or space set firstWord [string trimleft [string range $line 0 [expr {[string first "\t" $line] - 1}]]] # Compare with output file data set outputData [gets $outputFile] if {[string match "*$firstWord*" $outputData]} { # Match found, skip current line and the next two lines set skipLines 3 continue } } if {$skipLines > 0} { # Skip current line set skipLines [expr $skipLines - 1] continue } # Write the line to the output file puts $outputFile $line } close $inputFile close $outputFile
内容的提问来源于stack exchange,提问作者Santhosh Nayak D.
相关产品推荐
相关产品推荐

