Replace 使用其他文件的列更新值

Replace 使用其他文件的列更新值,replace,awk,Replace,Awk,如果文件A的值与文件B中字符串的一部分匹配,我想将文件A中的值与文件B中的值进行交换 归档 A1 A2 A3 A4 A5 文件B 1 A0:xxxx:z:y 1 A2:xxxx:z:y 1 A3:xxxx:z:y 1 CC:xxx1:z:y 1 A1:xxxx:z:y 1 CC:xxx2:z:y 期望输出 A1:xxxx:z:y A2:xxxx:z:y A3:xxxx:z:y A4 A5 我正在尝试使用下面的代码,但不起作用 awk 'NR==FNR{a[$1];next} {split(

如果文件A的值与文件B中字符串的一部分匹配,我想将文件A中的值与文件B中的值进行交换

归档

A1
A2
A3
A4
A5
文件B

1 A0:xxxx:z:y
1 A2:xxxx:z:y
1 A3:xxxx:z:y
1 CC:xxx1:z:y
1 A1:xxxx:z:y
1 CC:xxx2:z:y
期望输出

A1:xxxx:z:y
A2:xxxx:z:y
A3:xxxx:z:y
A4
A5
我正在尝试使用下面的代码,但不起作用

awk 'NR==FNR{a[$1];next} {split($2, b, ":"); if(b[1] in a) print $2; else print a[$1]}' fileA fileB > output.txt
Ps1:我以前看到过一些关于这个问题的答案,我正在尝试将这些答案应用到我的问题中,所以,如果可能的话,我想了解为什么我的代码是错误的。(主要是因为我想使用这段代码的核心来执行其他任务,因为文件之间的值交换是常见的)

Ps2:我想问题在于如何访问a中的值。我尝试使用[$1]=1和$2=a[$1],但都失败了。那么,在处理第二个文件时,检索第一个文件中列的值的最佳方法是什么呢


Ps3:在测试中,我注意到一个奇怪的行为。如果我要求打印一个字符串(例如“unchanged”或b[1]),而不是[$1],那么脚本似乎工作得很好(我可以看到匹配和不匹配的列,并且可以使用grep检查真正的匹配),但是当我使用[$1]时,代码会在一些不匹配的列中打印$2(我无法跟踪错误,因为与文件B中的最后两列几乎相同的列返回不同的结果,其中一列打印错误,另一列为否)。

编辑:更新问题的新答案

对这个问题有了新的理解,以其他顺序处理文件可能更容易(fileB优先)


谢谢@jas!我在这里提问之前也试过:awk'NR==FNR{a[NR];next}{split($2,b,“:”);if(a中的b[1]打印$2;else打印a[NR]}'fileA fileB>output.txt,但不起作用(出于某种原因,我似乎只能访问FNR中的值或当前文件).但我无法理解为什么我不能使用$1键访问数组a的值?数组a不是关联数组吗?不幸的是,它适用于示例(我也进行了测试),但不适用于我的实际数据(仅打印不匹配的行,并为不在a中的文件B的所有字段打印空行)。我试图找出问题所在,因为唯一的区别是我的真实数据比示例中描述的列多。我添加了一些可能有用的信息,我还将传递一些建议,Ed Morton是awk问题的主要撰稿人之一,他喜欢给出:“获取书籍”有效的awk编程,第三版“由Arnold Robbins编写”。超级@jas,现在我可以理解问题了。非常感谢!但我想问题仍然存在,如果两个文件中的匹配不在同一行,脚本将失败,对吗?(例如,如果1 A2:xxxx:z:y在第5行,或1 A1:xxxx:z:y在第6列)。这就是我试图比较这些值的原因。无论如何,我更新了问题,使其明确。
$ cat fileA
A1
A2
A3
A4
A5


$ cat fileB
1 A0:xxxx:z:y
1 A2:xxxx:z:y
1 A3:xxxx:z:y
1 CC:xxx1:z:y
1 A1:xxxx:z:y
1 CC:xxx2:z:y


$ cat jw.awk
# Process fileB first, creating an array with elements such as
# a["A0"] = "A0:xxxx:z:y", a["A2"] = "A2:xxxx:z:y", etc.    
NR == FNR { split($2, b, ":"); a[b[1]] = $2; next }

# Now process fileA, printing either the line from fileB if the
#  key is found, otherwise the line from fileA    
{ if ($1 in a) print a[$1]; else print }


$ awk -f jw.awk fileB fileA
A1:xxxx:z:y
A2:xxxx:z:y
A3:xxxx:z:y
A4
A5