016-老男孩教育每日一题-awk累计相加理解

  • A+
所属分类:科技资讯

假如现在有个文本,格式如下:

即左边是随机字母,右边是随机数字,要求写个脚本使其输出格式为:

即将相同的字母后面的数字加在一起,按字母的顺序输出。

答案:

演示:

过程详解:

第一个里程碑-把第二列的数字的总和

 

第二个里程碑-选择什么作为房间号码

这里只有两列,第一列是字母,第二列是数字是我们要相加的东西。这里我们选择第一列作为房间号码即元素名称。

第三个里程碑-遇到相同的字母再相加

这里就需要用到了awk数组的内容。

sum=sum+$2 这里把sum换成awk数组即可。

没有显示任何过程,不是很好。我们看看他到底如何处理的。一步一步来分析。注意这里我们只关注一个房间a,大家熟练后再同时看多个房间的内容。

我们只关注a房间的内容及h["a"]的内容

行号当前行的内容$1的内容$2的内容h["a"]之前的内容h["a"]=h["a"]+$2h["a"]之后的内容
1a 1a1h["a"]=空+11
2b 3b31不是a房间,不进行计算,h["a"]内容还是11
3c 2c21不是a房间,不进行计算,h["a"]内容还是11
4d 7d71不是a房间,不进行计算,h["a"]内容还是11
5b 5b51不是a房间,不进行计算,h["a"]内容还是11
6a 3a31h["a"]=1+34
7g 2g24不是a房间,不进行计算,h["a"]内容还是14
8f 6f64不是a房间,不进行计算,h["a"]内容还是14
9d 9d94不是a房间,不进行计算,h["a"]内容还是14

似曾相识的表格呀,我看结合这个表格看看执行过程。

首先读取第一行:

$1内容是a,$2内容是1,这里我们也创建了数组h[$1],我们要计算h[$1]=h[$1]+$2,即h["a"]=空+1.此时h["a"]的内容是1.

然后读取第二行:

$1内容是b,不是我们要的a房间我们跳过,此时h["a"]的内容依然是1

继续往下读情况都是一样的直到读取到第六行

$1内容是a,$2内容是3,这里我们也创建了数组h[$1],我们要计算h[$1]=h[$1]+$2,即h["a"]=1+4.此时h["a"]的内容是4.

awk继续往下读取直到读取到最后一行$1都不是a,所以h["a"]房间的内容不会发生变化。

现在大家再看一下执行过程,注意我们只关注h["a"]房间的内容。

 

这时候你应该理解他到底如何执行的了。

下面我们看看他完整的执行过程。

行号当前行的内容$1的内容$2的内容h[$1]之前的内容h[$1]=h[$1]+$2h[$1]之后的内容
1a 1a1h["a"]=空+11
2b 3b3h["b"]=空+33
3c 2c2h["c"]=空+22
4d 7d7h["d"]=空+77
5b 5b53h["b"]=3+58
6a 3a31h["a"]=1+34
7g 2g2h["g"]=空+22
8f 6f6h["f"]=空+66
9d 9d97h["d"]=7+916

执行过程如下:

第四个里程碑-**只显示最终结果**

刚开始我们看着执行过程,可以帮助我们理解awk数组。但是我们的目标是获得每个房间的最后的结果。所以还要用END模式对awk数组进行处理。

这就是我们要的最终结果。
今天是老男孩教育每日一题陪伴大家的第16天。

对于题目和答案的任何疑问,请在博客评论区留言。

往期题目索引

https://www.drscrewdriver.com/100.html

历史上的今天:

weinxin
我的微信公众号
我的微信公众号扫一扫

发表评论

:?::razz::sad::evil::!::smile::oops::grin::eek::shock::???::cool::lol::mad::twisted::roll::wink::idea::arrow::neutral::cry::mrgreen: