使用 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..
而不是按顺序进行。 (例如,这里 bbbb
的 pwd
值应该是 2b2b
而不是 9b9b
)。
源文件(src.txt)
aaaa
uid=xxxx
pwd=nnnn
u_no=12345
bbbb
uid=yyyy
pwd=eeee
zzzz
uid=yyyy
pwd=eeee
注意 uid
和 pwd
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
的查找值和 bbbb
的 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[,] =
}
next
}
{
if (NF==1) {
key = [=18=]
}
else {
[=18=] = "=" map[key,tolower()]
}
print
}
$ awk -f tst.awk ref.txt src.txt
这符合我最初的期望,但现在添加了我在此处指定的 requirement 1
和 requirement 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
这是我之前的 post
(我使用的源文件和代码在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..
而不是按顺序进行。 (例如,这里 bbbb
的 pwd
值应该是 2b2b
而不是 9b9b
)。
源文件(src.txt)
aaaa
uid=xxxx
pwd=nnnn
u_no=12345
bbbb
uid=yyyy
pwd=eeee
zzzz
uid=yyyy
pwd=eeee
注意 uid
和 pwd
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
的查找值和 bbbb
的 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[,] =
}
next
}
{
if (NF==1) {
key = [=18=]
}
else {
[=18=] = "=" map[key,tolower()]
}
print
}
$ awk -f tst.awk ref.txt src.txt
这符合我最初的期望,但现在添加了我在此处指定的 requirement 1
和 requirement 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