老男孩教育每日一题-第126天-通过shell脚本打印乘法口诀表

老男孩教育每日一题-第126天-通过shell脚本打印乘法口诀表

问题背景:

生成9*9乘法表

[root@oldboy~]#seq9|sed'H;g'|awk-vRS='''{for(i=1;i<=NF;i++)printf("%dx%d=%d%s",i,NR,i*NR,i==NR?"\n":"\t")}'
1x1=1
1x2=22x2=4
1x3=32x3=63x3=9
1x4=42x4=83x4=124x4=16
1x5=52x5=103x5=154x5=205x5=25
1x6=62x6=123x6=184x6=245x6=306x6=36
1x7=72x7=143x7=214x7=285x7=356x7=427x7=49
1x8=82x8=163x8=244x8=325x8=406x8=487x8=568x8=64
1x9=92x9=183x9=274x9=365x9=456x9=547x9=638x9=729x9=81

问题分析解决

第一步: seq 9

[root@oldboy~]#seq9
1
2
3
4
5
6
7
8
9
小结 为何用seq呢?
`seq'printsthenumbersfromFirsTtoLASTbyINCREMENT.Bydefault,eachnumberisprintedonaseparateline.

很容易发现seq生成的 数字每一个都是一行。
如果使用 echo {1..9} 则会在一行。无法把结果传到给sed处理。

第二步: sed ‘H;g’

[root@oldboy~]#seq9|sed'H;g'

1

1
2

1
2
3

1
2
3
4

1
2
3
4
5

1
2
3
4
5
6

1
2
3
4
5
6
7

1
2
3
4
5
6
7
8

1
2
3
4
5
6
7
8
9

小结:

wKiom1moDvWS22btAAqmEuPRZy0977.png

wKioL1moDuPSbL6OAAeVnzNk3uQ953.png

了解根据上图了解HGx用法即可。

第三步:

第一小步:
[root@oldboyscripts]#seq9|sed'H;g'|awk-vRS='''{print$1,$2,$3,$4,$5,$6,$7,$8,$9}'
1
12
123
1234
12345
123456
1234567
12345678
123456789

小结:
1.-v 定义变量 这个变量可以在awk中使用
2.RS即 record separator
RS == “”
Records are separated by runs of blank lines. Leading and trailing newlines in a file are ignored.
每个记录(每行)被一个或多个空行分隔。文件中的换行都被忽略。

第二小步:
第一小小步
[root@oldboyscripts]#seq9|sed'H;g'|awk-vRS='''{for(i=1;i<=NF;i++)printf("%d",i)}'
112123123412345123456123456712345678123456789[root@oldboyscripts]#

改为循环输出,可是却都在一行。

小结:
  1. printf认不会输出换行(与print有区别)

  2. 需要手动按照条件(每个字段(record)的最后一列))输出换行”\n”

第二小小步
[root@oldboyscripts]#seq9|sed'H;g'|awk'
BEGIN{RS=""}
>{
>for(i=1;i<=NF;i++)
>{if(i==NF)
>char="\n"
>else
>char="\t"
>printf("%d%s",char)
>}
>}'
1
12
123
1234
12345
123456
1234567
12345678
123456789

简写为

[root@oldboyscripts]#seq9|sed'H;g'|awk-vRS='''{for(i=1;i<=NF;i++)printf("%d%s",i==NF?"\n":"\t")}'
1
12
123
1234
12345
123456
1234567
12345678
123456789
小结:

1.exp?exp1:exp2 这是常用的条件运算符。也是最特殊的一个三目运算符。如果前面两句你不懂。记住一句话:if (condition) then-body else else-body 一样的
2.判断是否是一个字段的最后一个数 i==NF 来判断。
3.如果是最后一个则换行
4.不是则输出\t

最后一步

第一小步

配出

1*1
1*22*2
…………

的形式

[root@oldboyscripts]#seq9|sed'H;g'|awk-vRS='''{for(i=1;i<=NF;i++)printf("%d*%d%s",i==NF?"\n":"\t")}'
1*1
1*22*2
1*32*33*3
1*42*43*44*4
1*52*53*54*55*5
1*62*63*64*65*66*6
1*72*73*74*75*76*77*7
1*82*83*84*85*86*87*88*8
1*92*93*94*95*96*97*98*99*9
最后一小步

计算结果

[root@oldboyscripts]#seq9|sed'H;g'|awk-vRS='''{for(i=1;i<=NF;i++)printf("%d*%d=%d%s",i==NF?"\n":"\t")}'
1*1=1
1*2=22*2=4
1*3=32*3=63*3=9
1*4=42*4=83*4=124*4=16
1*5=52*5=103*5=154*5=205*5=25
1*6=62*6=123*6=184*6=245*6=306*6=36
1*7=72*7=143*7=214*7=285*7=356*7=427*7=49
1*8=82*8=163*8=244*8=325*8=406*8=487*8=568*8=64
1*9=92*9=183*9=274*9=365*9=456*9=547*9=638*9=729*9=81

小结:

  1. 了解sed的模式空间,了解就行能看懂就行了。

  2. awk的NR=””空的用法

备注

今天是每日一题陪伴大家的第126天期待你的进步

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

http://www.jb51.cc/article/p-dxklwfhw-bcy.html

相关文章

用的openwrt路由器,家里宽带申请了动态公网ip,为了方便把2...
#!/bin/bashcommand1&command2&wait从Shell脚本并行...
1.先查出MAMP下面集成的PHP版本cd/Applications/MAMP/bin/ph...
1、先输入locale-a,查看一下现在已安装的语言2、若不存在如...
BashPerlTclsyntaxdiff1.进制数表示Languagebinaryoctalhexa...
正常安装了k8s后,使用kubect工具后接的命令不能直接tab补全...