awk 脚本在 SunOS 中无法正常工作(在 Red Hat 中运行良好)

awk script not working properly in SunOS (which worked well with Red Hat)

我一直在寻找要在 awk 中完成的文件替换功能。我有一个适用于 Red Hat Linux 风格的解决方案,但它不适用于 SunOS 5.10。如果有人可以帮助解决问题,那就太好了。

源文件 (src.txt)

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

参考文件 (ref.txt)

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

需要输出文件 (tgt.txt)

目标文件应该是根据参考文件中的查找值更新的源文件,如下所示:

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

代码

awk -F= '
FNR==NR {
split([=13=],b,",")
a[b[1] FS b[2]]=b[3]
next} 
!/=/ {
f=
print
next} 
{
print "="(a[f FS ]?a[f FS ]:)}
' ref.txt src.txt > tgt.txt

代码解决方案是由我们的一位朋友在 Stack Overflow 中提供的,它在 Red Hat Linux 中运行良好。

当我尝试将其复制到 SunOS 5.10 时,它首先显示语法错误:

!/=/ {   

我替换了字段分隔符值,它不再显示语法错误。

OFS="="

为此,脚本执行,但只打印源文件值(不是更新值)。

你能帮我找到解决办法吗?

在 Solaris 中使用 nawk(新 awk)或 /usr/xpg4/bin/awk(POSIX awk)。 awk 是原始遗留版本。

这是有效的方法:

nawk -F= '
FNR==NR {
split([=10=],b,",")
a[b[1] FS b[2]]=b[3]
next}
[=10=] !~ "=" {
f=
print
next}
{
print "="(a[f FS ]?a[f FS ]:)}
' ref.txt src.txt > tgt1.txt