Unix awk脚本在SunOS中无法正常工作(与Red Hat配合使用效果良好)

Unix awk脚本在SunOS中无法正常工作(与Red Hat配合使用效果良好),unix,awk,solaris,sunos,Unix,Awk,Solaris,Sunos,我想在awk中实现文件替换功能。我有一个适合Red Hat Linux风格的解决方案,但它不适合SunOS 5.10。如果有人能帮助解决问题,那就太好了 源文件(src.txt) 参考文件(ref.txt) 所需的输出文件(tgt.txt) 目标文件应是基于参考文件中的查找值更新的源文件,如下所示: aaaa uid=1a1a pwd=1b1b u_no=12345 bbbb uid=2a2a pwd=2b2b zzzz uid=9a9a pwd=9b9b 代码 awk -F= ' FNR==

我想在
awk
中实现文件替换功能。我有一个适合Red Hat Linux风格的解决方案,但它不适合SunOS 5.10。如果有人能帮助解决问题,那就太好了

源文件(src.txt)

参考文件(ref.txt)

所需的输出文件(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($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 > 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($0,b,",")
a[b[1] FS b[2]]=b[3]
next}
$0 !~ "=" {
f=$1
print
next}
{
print $1"="(a[f FS $1]?a[f FS $1]:$2)}
' ref.txt src.txt > tgt1.txt

您应该能够更换
/=/
$0!~/=/。您是否打印了代码的第一部分生成的内容—b[1]、b[2]、b[3]中的值?您是否在最后一节中打印了匹配的值($1,$2)?请注意,Solaris 10有
nawk
awk
,它们的功能数量少于GNU awk。您可以尝试使用
gawk
,但它仅在外部软件包中可用:即@JonathanLeffler--trued“…$0!~/=/…”。。没用。。。语法错误消失了。。。但功能不起作用……:-(@myaut--Can to gawk buddy…无论如何..我的scipt与红帽子配合得很好,只需一个awk…明白了…谢谢!-)你编辑了你的帖子吗???我认为您提供的上一个解决方案对我有效……对不起,我确实编辑了。我将检查一个真实的Solaris 10实例。稍后将更新。我刚刚检查过,它在Solaris 10 update 10计算机上运行良好。唯一可能让您困惑的更改是输出在
tgt1.txt
上,而不是
tgt.txt
(我将其更改为能够比较GNU awk和Solaris awk输出)。
OFS="="
nawk -F= '
FNR==NR {
split($0,b,",")
a[b[1] FS b[2]]=b[3]
next}
$0 !~ "=" {
f=$1
print
next}
{
print $1"="(a[f FS $1]?a[f FS $1]:$2)}
' ref.txt src.txt > tgt1.txt