我一直在寻找要在 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
代码解决方案是由我们的一位 friend 在 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
关于unix - awk 脚本在 SunOS 中无法正常工作(在 Red Hat 中运行良好),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29092550/