使用 bash/awk 合并带有困难字段分隔符的文件 A 和文件 B

bra*_*ord 3 linux bash merge configuration awk

类似于我的旧问题: 如何使用 bash 脚本合并 FileA.txt 和 FileB.txt 赋予 FileB.txt 覆盖能力?

我想合并两个配置值文件,同样我有 fileA 和 fileB。我想要fileA 中fileB 的所有行,如果两个文件中出现相同的配置键,我希望fileB 中的值覆盖fileA 中的值。

每行总是以“config”开头,然后是一个键,最后是一个值。使它变得困难的部分是该值可以是带空格的带引号的字符串以分隔多个值(请参阅“网站”值)。

我有一些使用 awk 的经验和相当多的 bash 经验,但我一生都无法想出一种方法来做到这一点。感谢所有帮助。谢谢

文件A:

config lanIP 10.1.1.1
config wanIP 1.1.1.1
config wanIPMask 255.255.255.255
config website "http://google.com http://yahoo.com"
Run Code Online (Sandbox Code Playgroud)

文件B:

config lanIP 192.168.1.1
config wanIP 1.1.1.1
config website "http://google.com http://yahoo.com"
config moreWebsite "http://google.com http://msn.com"
Run Code Online (Sandbox Code Playgroud)

预期输出:

config lanIP 192.168.1.1
config wanIP 1.1.1.1
config wanIPMask 255.255.255.255
config website "http://google.com http://yahoo.com"
config moreWebsite "http://google.com http://msn.com"
Run Code Online (Sandbox Code Playgroud)

Ken*_*ent 5

这个单线可能有帮助:

awk '{a[$2]=$0}END{for(x in a)print a[x]}' fileA fileB
Run Code Online (Sandbox Code Playgroud)

注意:上面的行很短,但没有保持行的顺序。(你没有提到排序标准)

测试:

kent$  head a b
==> a <==
config lanIP 10.1.1.1
config wanIP 1.1.1.1
config wanIPMask 255.255.255.255
config website "http://google.com http://yahoo.com"

==> b <==
config lanIP 192.168.1.1
config wanIP 1.1.1.1
config website "http://google.com http://yahoo.com"
config moreWebsite "http://google.com http://msn.com"

kent$  awk '{a[$2]=$0}END{for(x in a)print a[x]}' a b                       
config wanIP 1.1.1.1
config lanIP 192.168.1.1
config moreWebsite "http://google.com http://msn.com"
config wanIPMask 255.255.255.255
config website "http://google.com http://yahoo.com"
Run Code Online (Sandbox Code Playgroud)

如果你想在你的问题中使用相同的顺序,试试这个单行:

awk '!($2 in a){i[NR]=$2}{a[$2]=$0}END{for(x=1;x<=NR;x++)if(x in i)print a[i[x]]}' a b
Run Code Online (Sandbox Code Playgroud)

测试

kent$  awk '!($2 in a){i[NR]=$2}{a[$2]=$0}END{for(x=1;x<=NR;x++)if(x in i)print a[i[x]]}' a b
config lanIP 192.168.1.1
config wanIP 1.1.1.1
config wanIPMask 255.255.255.255
config website "http://google.com http://yahoo.com"
config moreWebsite "http://google.com http://msn.com"
Run Code Online (Sandbox Code Playgroud)