首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为awk命令替换字段值而获得的重复结果

为awk命令替换字段值而获得的重复结果
EN

Stack Overflow用户
提问于 2020-07-02 11:34:41
回答 2查看 55关注 0票数 0

我有一份文件,里面有我们店里的动物和鸟类的记录,下面给出了一个小片段:

狗:4只

猫: 10只

鹦鹉:5只

如果可能的话,我想要一个带有awk的班轮,可以增加1只猫的数量,减少3只幼崽的数量。命令应该是一个衬垫,而不是使用管道。因为有了管道,我已经获得了想要的结果,但是我需要用一个awk命令来完成这个任务。

需要输出的是:狗:4只猫: 11只鹦鹉:2只我正在用下面的命令来做这件事:

尝试1:

代码语言:javascript
复制
awk -F ':' '{OFS=":"}; NR==2{$2=$2+1}1; NR==3{$2=$2-3}1' file

尝试2

代码语言:javascript
复制
awk -F ':' '{OFS=":"}; /Cats/ {$2=$2+1}1; /Parrots/ {$2=$2-3}1' file

这两个命令的输出如下:

代码语言:javascript
复制
Dogs: 4
Dogs: 4
Cats: 11
Cats: 11
Parrots: 5
Parrots: 2

结果是重复的。我本来可以使用uniq来过滤副本,但问题是第三行Cubs显示的是原始值和更改值。当第二行显示两次更改的值时。

我还想知道,由于sed能够使用-e选项在一个命令中执行多个更改,或者像sed -e '1d‘-e '$d’文件或sed '1d;$d‘文件一样,do awk具有这样的功能。因为我试过同样的方法,但结果很重复。

请更改并澄清我的命令。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-02 12:37:23

代码语言:javascript
复制
awk -F ':' 'BEGIN {OFS=":"} /Cats/ {$2=$2+1} /Parrots/ {$2=$2-3} 1' file

以上增加猫1,减少鹦鹉3。

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

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

票数 0
EN

Stack Overflow用户

发布于 2020-07-02 12:41:31

它是打印两次,因为你要求它打印两次。1;的意思是“这是在每一行上匹配的真实条件;此时执行默认操作(即打印当前输入记录)”。如果您只想这样做一次,那么只做一次(可能在脚本的末尾)。

实际上,您已经发现,Awk的流程模型非常类似于sed;整个脚本应用于每个输入行(或者,在Awk中,更广泛地说,每个记录(在默认情况下,记录是一行,但可以轻松地更改)),而脚本执行过程中对输入记录所做的任何更改在脚本的后续行中都是可见的。但是,由于Awk比sed通用得多,许多可能的脚本操作不会直接影响当前的输入行;您可以操作变量、调用函数,并且通常可以做任何适当的成熟编程语言能够做的事情(但是对sed很好,尽管它很少;它只做了一件非常好的事情,尽管不太清楚)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62695457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档