如何比较不同文件中的两行并在TCL中的另一行输出相同的位置?

时间:2016-04-21 05:52:42

标签: tcl

我有两个文件,我想要输出如下。请帮我提供一个TCL脚本。

File1中:

Name1: F * F F F
Name2: F F *
Name3: F F F F 

文件2:

Name1: AA, BB, CC, DD, EE,
Name2: AA, BB, CC,
Name3: AA, BB, CC, DD,

输出1:

Name1
  AA - FAIL
  BB - *
  CC - FAIL
  <cont>
Name2
  AA - FAIL
  BB - FAIL
  CC - *
  <cont>

输出2:

Name1
  FAIL - AA CC DD EE
  *    - BB
Name2
  FAIL - AA BB
  *    - CC
Name3
  FAIL - AA BB CC DD

2 个答案:

答案 0 :(得分:0)

tclsh8.5

上测试以下测试结果
set fd1 [open "input_file_1.txt" r]
set fd2 [open "input_file_2.txt" r]
set opfd [open "output_file.txt" w]

while {[gets $fd1 line] > 0 && [gets $fd2 line2] > 0} {
    set line1 [split $line ":"]
    set line2 [split $line2 ":"]
    puts $opfd [lindex $line1 0]

    set last_part_1 [string trim [lindex $line1 1] " "]
    set last_part_2 [string trim [lindex $line2 1] " "]

    set space_split [split $last_part_1 " "]
    set comma_split [split $last_part_2 ","]

    for {set i 0} {$i < [llength $space_split]} {incr i} {
        puts $opfd "[string trim [lindex $comma_split $i] " "] = [string trim [lindex $space_split $i] " "]"
    }
}

close $fd1
close $fd2
close $opfd

将在当前目录中创建名为output_file.txt的文件,其中包含您的输出。

答案 1 :(得分:0)

另一种方法:

package require fileutil

proc getInput filename {
    set contents [string trim [::fileutil::cat $filename]]
    set rows [split $contents \n]
    concat {*}[lmap item $rows {
        split $item :
    }]
}

set d1 [string map {F Fail} [getInput file1.txt]]
set d2 [string map {, {}} [getInput file2.txt]]
dict for {key values} $d1 {
    puts $key
    foreach v1 $values v2 [dict get $d2 $key] {
        puts "  $v2 - $v1"
    }
}

这可以通过识别数据文件的类字典结构来实现。如果每个数据都是没有空格的单词,则此版本的getInput会将每个文件的内容强制转换为可用的dict。从那里开始,只需要用F字符串替换Fail字符串并删除逗号,然后对其中一个dict进行字典迭代并拉动来自另一个的相应值。

如果第二个文件中的值可能包含空格,getInput应如下所示:

proc getInput filename {
    set contents [string trim [::fileutil::cat $filename]]
    set rows [split $contents \n]
    set res {}
    foreach item $rows {
        lassign [split $item :] key values
        if {[string match *,* $values]} {
            set values [split [string trimright $values {, }] ,]
        }
        lappend res $key $values
    }
    return $res
}

文档:concatdictforeachiflassignlmaplmap替换,{{ 3}},packageprocputsreturnsetsplit