老男孩教育每日一题-第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
小结:
了解根据上图了解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]#
改为循环输出,可是却都在一行。
小结:
第二小小步
[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
小结:
了解sed的模式空间,了解就行能看懂就行了。
awk的NR=””空的用法。
备注
今天是每日一题陪伴大家的第126天,期待你的进步。