比较来自2个文件的关键字,并将与关键字关联的值从一个文件替换为另一个文件

时间:2012-07-18 23:48:28

标签: awk tcl

很抱歉没有明确的标题。我会试着解释一下我的问题。

我有两个文件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流程的一部分。

3 个答案:

答案 0 :(得分: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

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

答案 1 :(得分: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

答案 2 :(得分:0)

您可以用您选择的语言编写一个简单的脚本,将字符串拆分为空格字符并使用数组(取决于文件的大小)。

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

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