1

抱歉没有明确的标题。我会尽力解释我的问题。

我有两个文件 A 和 B。

文件 A的格式是这样的:

set_time 10 temp max 2 min 1 xyzzy
set_time 10 temp max 2 min 1 abcde
set_time 10 temp max 3 min 2 ersfg
set_time 8  temp max 2 min 0 fdfdf

文件 B如下所示:

xyzzy 7.5
abcde 8.5
ersfg 9.5
fdfdf 9.0

现在,需要做的是,我必须搜索文件 A中的最后一列名称(xyzzyabcdefdfdf等),并将第二列值替换为文件 B中的第二列值。

因此,输出应如下所示:

set_time 7.5 temp max 2 min 1 xyzzy
set_time 8.5 temp max 2 min 1 abcde
set_time 9.5 temp max 3 min 2 ersfg
set_time 9.0 temp max 2 min 0 fdfdf

任何帮助表示赞赏。这是 TCL 流程的一部分。

4

3 回答 3

2

读取带有映射的第二个文件,如下所示:

set f [open file_B]
set mapping [dict create]
while {[gets $f l]} {
    if {[feof $f]} break
    dict set mapping {*}$l
}

然后通过制作一个输出自身的命令来处理原始文件set_time,同时更改所需的值:

proc set_time {num_to_replace temp max maxnum min minnum mapval} {
    puts "set_time [dict get $::mapping $mapval] $temp $max $maxnum $min $minnum $mapval"
}

然后只是source原始数据文件:

source file_A

这当然假设这两个文件中没有其他行会打乱处理。

于 2012-07-19T00:39:15.650 回答
1

也许你会发现一个awk有用的脚本:

FNR == NR {
    fileA[$1] = $2
    next
}

{
    for (i in fileA) {
        if (i == $NF) {
            $2 = fileA[i]
            print
        }
    }
}

像这样运行:

awk -f script.awk fileB.txt fileA.txt

结果:

set_time 7.5 temp max 2 min 1 xyzzy
set_time 8.5 temp max 2 min 1 abcde
set_time 9.5 temp max 3 min 2 ersfg
set_time 9.0 temp max 2 min 0 fdfdf
于 2012-07-19T01:44:56.977 回答
0

您可以使用您选择的语言编写一个简单的脚本来执行此操作,在空格字符处拆分字符串并使用数组(取决于文件的大小)。

但是,如果这是您这次只需要完成的一次性情况,请打开 Excel 并将文件导入为由空格字符(或任何相关字符)分隔的 CSV 文件。然后,您可以根据需要对行进行排序并复制“n”粘贴整列值。在包含空格的值之间添加一些额外的列,填写它们然后将文件保存为纯文本。

它可能不漂亮,但对于组合简单的数据集可能非常有效。尤其是一次性任务。

于 2012-07-19T00:02:30.237 回答