首页 > 解决方案 > 使用 awk 命令替换字段值时获得的重复结果

问题描述

我有包含我们商店中动物和鸟类记录的文件,其中的一小部分如下所示:

狗:4
猫:10
鹦鹉:5

如果可能的话,我想要一个带 awk 的衬垫,将猫的数量增加 1 并将幼崽的数量减少 3。命令应该是一个衬垫,而不是使用管道。因为使用管道我已经获得了预期的结果,但我需要在单个 awk 命令中完成此操作。

所需的输出是: Dogs:4 Cats:11 Parrots:2 我使用以下命令执行此操作:

尝试1:

awk -F ':' '{OFS=":"}; NR==2{$2=$2+1}1; NR==3{$2=$2-3}1' file

试试 2

awk -F ':' '{OFS=":"}; /Cats/ {$2=$2+1}1; /Parrots/ {$2=$2-3}1' file

两个命令的输出是:

Dogs: 4
Dogs: 4
Cats: 11
Cats: 11
Parrots: 5
Parrots: 2

结果是重复的。我会做 uniq 来过滤重复项,但问题是 Cubs 的第三行显示原始值和更改值。而第二行显示两次更改的值。

我还想知道,因为 sed 能够使用 -e 选项或在一个命令中进行多项更改;像 sed -e '1d' -e '$d' file 或 sed '1d;$d' file 一样,awk 有这样的能力。因为我尝试了同样的事情,但我得到了重复的结果。

请对我的命令进行更改和澄清。

标签: awk

解决方案


awk -F ':' 'BEGIN {OFS=":"} /Cats/ {$2=$2+1} /Parrots/ {$2=$2-3} 1' file

以上内容增加了 Cats 1,减少了 Parrots 3。

您的命令打印两次,因为1具有空操作的模式在您的命令中出现两次。

我已将设置OFS移至一个BEGIN块,因此它不会对每一行都这样做。我在1最后只包含了一次模式,以便在print($0)完成所有修改后默认操作只运行一次。


推荐阅读