这是我之前发布的帖子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
这对我最初的期望很好,但是我在这里指定的zzzz
和aaaa
uid=1a1a
pwd=1b1b
u_no=12345
bbbb
uid=2a2a
pwd=2b2b
zzzz
uid=9a9a
pwd=9b9b
现在已添加,所以我需要这些解决方案。
答案 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