使用其他文件的列更新值

时间:2015-08-05 20:28:39

标签: replace awk

如果文件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中的最后两列相同的列返回不同的结果,其中一个是不正确的打印,而另一个没有)。

1 个答案:

答案 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