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

标签 unix awk solaris sunos

我一直在寻找要在 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/

相关文章:

unix - SED - 将字符串添加到 nginx 配置 block 的末尾

bash - 如果找到数字,如何按模式在 bash 中拆分文件

python - 查找并删除 CSV 文件中的重复项

linux - Linux 和 Solaris 之间的 RPC 调用

perl - grep regex 到 perl 或 awk

bash - 从标准输入 Bash 逐行读取

unix - 计算每行内字段的累积和

unix - 如何在文件中的每三行之前附加字符串

linux - 将 awk 输出保存到变量

c++ - 内存溢出的Dtrace?