我有一份文件,里面有我们店里的动物和鸟类的记录,下面给出了一个小片段:
狗:4只
猫: 10只
鹦鹉:5只
如果可能的话,我想要一个带有awk的班轮,可以增加1只猫的数量,减少3只幼崽的数量。命令应该是一个衬垫,而不是使用管道。因为有了管道,我已经获得了想要的结果,但是我需要用一个awk命令来完成这个任务。
需要输出的是:狗:4只猫: 11只鹦鹉: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’文件或sed '1d;$d‘文件一样,do awk具有这样的功能。因为我试过同样的方法,但结果很重复。
请更改并澄清我的命令。
发布于 2020-07-02 12:37:23
awk -F ':' 'BEGIN {OFS=":"} /Cats/ {$2=$2+1} /Parrots/ {$2=$2-3} 1' file以上增加猫1,减少鹦鹉3。
您的命令打印两次,因为带空操作的模式1在命令中出现了两次。
我已经将OFS的设置移动到一个BEGIN块中,这样它就不会对每一行都这样做。我最后只包含了一次模式1,所以在完成所有修改之后,默认的print($0)操作只运行一次。
发布于 2020-07-02 12:41:31
它是打印两次,因为你要求它打印两次。1;的意思是“这是在每一行上匹配的真实条件;此时执行默认操作(即打印当前输入记录)”。如果您只想这样做一次,那么只做一次(可能在脚本的末尾)。
实际上,您已经发现,Awk的流程模型非常类似于sed;整个脚本应用于每个输入行(或者,在Awk中,更广泛地说,每个记录(在默认情况下,记录是一行,但可以轻松地更改)),而脚本执行过程中对输入记录所做的任何更改在脚本的后续行中都是可见的。但是,由于Awk比sed通用得多,许多可能的脚本操作不会直接影响当前的输入行;您可以操作变量、调用函数,并且通常可以做任何适当的成熟编程语言能够做的事情(但是对sed很好,尽管它很少;它只做了一件非常好的事情,尽管不太清楚)。
https://stackoverflow.com/questions/62695457
复制相似问题