使用 awk 命令替换字符串

string replacement using awk command

这是我之前的 post 的延续,它不是 100% 完全解决的..为了更清楚..

(我使用的源文件和代码在post的底部)

要求 1

如果我没有查找数据(例如,对于 "u_no" 不在参考文件中,当前解决方案打印一个空字段。

aaaa
uid=1a1a
pwd=1b1b
u_no=

我希望它从源文件中选择值..

aaaa
uid=1a1a
pwd=1b1b
u_no=12345

要求 2

如果源文件或参考文件中的数据混淆了,它应该仍然正确地进行替换。

也就是ref文件改成这样的时候:

block,parameter,value
aaaa,uid,1a1a
aaaa,pwd,1b1b
bbbb,uid,2a2a
zzzz,pwd,9b9b
zzzz,uid,9a9a
bbbb,pwd,2b2b

为此,我得到

aaaa
uid=1a1a
pwd=1b1b
u_no=
bbbb
uid=2a2a
pwd=9b9b
zzzz
uid=9a9a
pwd=2b2b

** 我必须得到**

aaaa
uid=1a1a
pwd=1b1b
u_no=12345    #points to my req 1 
bbbb
uid=2a2a
pwd=2b2b
zzzz
uid=9a9a
pwd=9b9b

我希望搜索和替换基于块发生 aaaa,bbbb,zzzz,etc.. 而不是按顺序进行。 (例如,这里 bbbbpwd 值应该是 2b2b 而不是 9b9b)。

源文件(src.txt)

aaaa
uid=xxxx
pwd=nnnn
u_no=12345
bbbb
uid=yyyy
pwd=eeee
zzzz
uid=yyyy
pwd=eeee

注意 uidpwd bbbb 的值与 src 文件中 zzzz 的值相同。

参考文件(ref.txt)

block,parameter,value
aaaa,uid,1a1a
aaaa,pwd,1b1b
bbbb,uid,2a2a
zzzz,pwd,9b9b
zzzz,uid,9a9a
bbbb,pwd,2b2b

注意:ref 文件中的记录顺序也可能会发生变化,正如我在要求 2 中提到的那样。uid 的查找值和 bbbbpwd 的查找值与此不同zzzz。但我需要如下结果:-

需要输出文件(src_out.txt)(包括要求 1 和 2)

aaaa
uid=1a1a
pwd=1b1b
u_no=12345
bbbb
uid=2a2a
pwd=2b2b
zzzz
uid=9a9a
pwd=9b9b

代码

$ cat tst.awk
BEGIN { FS = "[,=]+" }
NR==FNR {
    if (NR>1) {
        map[,] = 
    }
    next
}
{
    if (NF==1) {
        key = [=18=]
    }
    else {
        [=18=] =  "=" map[key,tolower()]
    }
    print
}

$ awk -f tst.awk ref.txt src.txt

这符合我最初的期望,但现在添加了我在此处指定的 requirement 1requirement 2,因此我需要这些的解决方案。

这是 awk

的一种解决方案
awk -F= '
FNR==NR {
    split([=10=],b,",")
    a[b[1] FS b[2]]=b[3]
    next} 
!/=/ {
    f=
    print
    next} 
    {
    print "="(a[f FS ]?a[f FS ]:)}
' ref.txt src.txt
aaaa
uid=1a1a
pwd=1b1b
u_no=12345
bbbb
uid=2a2a
pwd=2b2b
zzzz
uid=9a9a
pwd=9b9b

调整以测试 ref 文件中是否存在 src 值:

$ cat tst.awk
BEGIN { FS = "[,=]+" }
NR==FNR {
    if (NR>1) {
        map[,] = 
    }
    next
}
{
    if (NF==1) {
        key = [=10=]
    }
    else if ( (key,tolower()) in map ) {
        [=10=] =  "=" map[key,tolower()]
    }
    print
}

$ awk -f tst.awk ref.txt src.txt
aaaa
uid=1a1a
pwd=1b1b
u_no=12345
bbbb
uid=2a2a
pwd=2b2b
zzzz
uid=9a9a
pwd=9b9b