如果文件A的值与文件B中字符串的一部分匹配,我想将文件A中的值与文件B的值进行交换。
档案A
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:在测试期间,我注意到一种奇怪的行为。如果我要求打印一个字符串(例如"未更改"或b [1])而不是[$ 1],脚本似乎运行良好,(我可以看到匹配和不匹配的列,我可以使用grep检查真正的匹配),但是当我使用[$ 1]时,代码在某些不匹配的列中打印$ 2(我无法跟踪错误,因为与文件B中的最后两列相同的列返回不同的结果,其中一个是不正确的打印,而另一个没有)。
答案 0 :(得分:1)
编辑:更新问题的新答案。
通过对问题的新理解,可能更容易以其他顺序处理文件(fileB优先)
$ 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