使用awk命令替换字符串

时间:2015-03-12 14:36:43

标签: unix awk sed

这是我之前发布的帖子string replacement using awk command的延续,但并未100%完全解析..为了让它更清晰..

(我使用的源文件和代码位于帖子的底部)

要求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..不按顺序发生。 (例如,此处pwd的{​​{1}}值应为bbbb,而不是2b2b。)

源文件(src.txt)

9b9b

注意aaaa uid=xxxx pwd=nnnn u_no=12345 bbbb uid=yyyy pwd=eeee zzzz uid=yyyy pwd=eeee uid的{​​{1}}值与pwd文件中bbbb的值相同。

参考文件(ref.txt)

zzzz

注意:ref文件中记录的顺序也可能如我在要求2中提到的那样改变。src的{​​{1}}和block,parameter,value aaaa,uid,1a1a aaaa,pwd,1b1b bbbb,uid,2a2a zzzz,pwd,9b9b zzzz,uid,9a9a bbbb,pwd,2b2b 的查找值与uid的查找值不同{1}}。但我需要的结果如下: -

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

pwd

代码

bbbb

这对我最初的期望很好,但是我在这里指定的zzzzaaaa uid=1a1a pwd=1b1b u_no=12345 bbbb uid=2a2a pwd=2b2b zzzz uid=9a9a pwd=9b9b 现在已添加,所以我需要这些解决方案。

2 个答案:

答案 0 :(得分:0)

这是一个awk

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

答案 1 :(得分:0)

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

$ cat tst.awk
BEGIN { FS = "[,=]+" }
NR==FNR {
    if (NR>1) {
        map[$1,$2] = $3
    }
    next
}
{
    if (NF==1) {
        key = $0
    }
    else if ( (key,tolower($1)) in map ) {
        $0 = $1 "=" map[key,tolower($1)]
    }
    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