我一直在寻找在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($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="="
为此,脚本执行,但只打印源文件值(不是更新的值)。
你能帮我找到解决方案吗?
答案 0 :(得分:3)
在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