Awk替换模式

4

I have two sample files:

file1:

Bolek
jeden(wzór1)
Lolek
dwa(wzór2)
trzy(wzór3)

文件2:

czerwony
zielony
niebieski

我尝试了这个命令:

awk '{while(getline a < "file2"); sub(/wzór1/, a); print }' file1
Bolek
jeden(niebieski)
Lolek
dwa(wzór2)
trzy(wzór3)

我想用“file2”中的内容替换“file1”的wzór1。 我想打印:

Bolek
jeden(czerwony
zielony
niebieski)
Lolek
dwa(wzór2)
trzy(wzór3)

1
使用getline几乎总是错误的方法。请参见http://awk.info/?tip/getline。 - Ed Morton
2个回答

6

一种方法:

$ awk -v val="$(<file2)" '{sub(/wzór1/,val);}1' file1
Bolek
jeden(czerwony
zielony
niebieski)
Lolek
dwa(wzór2)
trzy(wzór3)

文件2的内容被读取到变量“cont”中。这个变量被传递给awk,并用变量内容替换所有wzor1的出现。

请注意,这种方法会剥离文件2末尾的任何空白行,而不是原样重现文件2的内容。这可能在您特定的输入文件中是期望的,也可能不是,但这是您应该知道的事情。 - Ed Morton

3
awk 'NR==FNR{r=r s $0; s=ORS; next} {sub(/wzór1/,r)} 1' file2 file1

假设您在UNIX上操作,以下是目前发布的两种方法之间的差异,请注意"file2"末尾的空行:

$ cat file2
czerwony
zielony
niebieski

$ awk 'NR==FNR{r=r s $0; s=ORS; next} {sub(/wzr1/,r)} 1' file2 file1
Bolek
jeden(czerwony
zielony
niebieski
)                   <--- note the empty line is reproduced
Lolek
dwa(wzr2)
trzy(wzr3)
$ awk -v val="$(<file2)" '{sub(/wzr1/,val);}1' file1
Bolek
jeden(czerwony
zielony
niebieski)          <--- note the empty line has been removed
Lolek
dwa(wzr2)
trzy(wzr3)

如果你不在UNIX上,那么我认为shell解决方案也是不适用的。

1
@steve 但它独立于操作系统运行(OP还没有告诉我们),并且可以精确地复制文件2,因此比发布的shell解决方案更具可移植性和健壮性。 - Ed Morton
啊,我经常忘记检查是否为空。好发现。你是对的,空行可能很重要,尽管根据问题无法确定。 - Steve
@steve 可能OP正在使用UNIX,删除末尾的空行对他的输入没有影响,但值得一提。对我来说,在awk中完成所有操作是自然而然的,但你的情况可能不同,如果你正在使用UNIX,混合一些shell命令使它更简洁也没有问题。 - Ed Morton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接