【发布时间】:2015-03-13 20:42:11
【问题描述】:
这是我之前的帖子 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.. 不按顺序进行。 (例如,这里bbbb 的pwd 值应该是2b2b 而不是9b9b)。
源文件(src.txt)
aaaa
uid=xxxx
pwd=nnnn
u_no=12345
bbbb
uid=yyyy
pwd=eeee
zzzz
uid=yyyy
pwd=eeee
注意bbbb 的uid 和pwd 值与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 中提到的那样。bbbb 的 uid 和 pwd 的查找值与 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[$1,$2] = $3
}
next
}
{
if (NF==1) {
key = $0
}
else {
$0 = $1 "=" map[key,tolower($1)]
}
print
}
$ awk -f tst.awk ref.txt src.txt
这符合我最初的预期,但现在添加了我在此处指定的 requirement 1 和 requirement 2,因此我需要解决这些问题。
【问题讨论】:
-
你有什么办法解决这个问题?
-
编辑您的问题,使其更加清晰和明确,这与您之前的问题(stackoverflow.com/q/28963149/1745001 和 stackoverflow.com/q/28849774/1745001)之间有什么区别,因为我根本看不到任何区别,并告诉我们以前的解决方案 (stackoverflow.com/a/28965212/1745001) 以何种方式无法满足您的新要求(无论它们是什么) - 显示它产生的输出以与您想要的输出进行比较。您需要在提出问题时付出更多的思考和努力,以便我们为您提供帮助。
-
@EdMorton -- 编辑了帖子....尽我所能解释! ...请看一下...感谢您的耐心等待...! :-)
-
@Jotne -- 请找到编辑后的帖子.... :-)