Awk 比较两个文件中的关键字,并将与关键字关联的值从一个文件替换为另一个文件

Awk 比较两个文件中的关键字,并将与关键字关联的值从一个文件替换为另一个文件,awk,tcl,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 xyzzy 7.5 abcde 8.5 ersfg 9.5 fdfdf 9.0 set f [open file_B] se

很抱歉没有一个清晰的标题。我会尽力解释我的问题

我有两个文件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
xyzzy 7.5
abcde 8.5
ersfg 9.5
fdfdf 9.0
set f [open file_B]
set mapping [dict create]
while {[gets $f l]} {
    if {[feof $f]} break
    dict set mapping {*}$l
}
文件B如下所示:

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
xyzzy 7.5
abcde 8.5
ersfg 9.5
fdfdf 9.0
set f [open file_B]
set mapping [dict create]
while {[gets $f l]} {
    if {[feof $f]} break
    dict set mapping {*}$l
}
现在,需要做的是,我必须在文件A中搜索最后的列名(
xyzy
abcde
fdfdf
,等等),并用文件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流程的一部分。

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

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


它可能并不漂亮,但对于组合简单数据集来说却非常有效。特别是对于一次性任务。

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

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
xyzzy 7.5
abcde 8.5
ersfg 9.5
fdfdf 9.0
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

当然,这假设两个文件中没有其他行会干扰处理。

也许您会发现
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

谢谢但这不是一次性的任务。这实际上是我正在编写的一个更大的TCL流程的一部分,我现在被困在这里。这是一种处理看起来像(无聊的)TCL脚本的文件的好方法。它可以很好地与脚本混合,但您必须阅读父级中的文件,并
$slave eval
它。@Birei,谢谢--通过我的
awk
脚本,我打算复制一个类似于Birei的响应:-)谢谢。在我看来,在阅读时,我注意到了相似之处,但一切都没问题。我这样做是为了方便用户阅读,所以很高兴在其他帖子中看到它:-)