awk - 使用 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 -F ':' 'BEGIN {OFS=":"} /Cats/ {$2=$2+1} /Parrots/ {$2=$2-3} 1' file
以上内容增加了 Cats 1,减少了 Parrots 3。
您的命令打印两次,因为1
具有空操作的模式在您的命令中出现两次。
我已将设置OFS
移至一个BEGIN
块,因此它不会对每一行都这样做。我在1
最后只包含了一次模式,以便在print($0)
完成所有修改后默认操作只运行一次。
推荐阅读
- c++ - C++ 编译 cpr
- c++ - 如何在 C++ 中使用 wininet 创建 POST 请求
- android - Android Studio 3.5 错误 - 安装失败,原因是:''pm install-create -r -t -S 1461173'
- jquery - 尝试将文件从一个 Web 上传到 API 时出错
- rust - 更改其他线程中的值并断言后者(在“主”线程中)
- python - 如何将我的代码转换为列表表达式
- function - 本例中如何正确使用self打印字符串
- node.js - 根据使用 Typescript 的目标导入库
- sql - 根据列值出现从结果集中消除行
- python - 我可以用方法定义指定类命名空间吗