linux+++乘法口诀_通过shell脚本打印乘法口诀表

怎么通过shell脚本打印乘法口诀表呢,今天Linux学习的小编就这一问题给大家详细的解决一下。

问题背景:

生成9*9乘法表

[root@oldboy ~]# seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")}'

1x1=1

1x2=2   2x2=4

1x3=3   2x3=6   3x3=9

1x4=4   2x4=8   3x4=12  4x4=16

1x5=5   2x5=10  3x5=15  4x5=20  5x5=25

1x6=6   2x6=12  3x6=18  4x6=24  5x6=30  6x6=36

1x7=7   2x7=14  3x7=21  4x7=28  5x7=35  6x7=42  7x7=49

1x8=8   2x8=16  3x8=24  4x8=32  5x8=40  6x8=48  7x8=56  8x8=64

1x9=9   2x9=18  3x9=27  4x9=36  5x9=45  6x9=54  7x9=63  8x9=72  9x9=81

问题分析解决

第一步: seq 9

[root@oldboy ~]# seq 9

1

2

3

4

5

6

7

8

9

小结 为何用seq呢?

`seq' prints the numbers from FIRST to LAST by INCREMENT.  By default, each number is printed on a separate line.

很容易发现seq生成的 数字每一个都是一行。

如果使用 echo {1..9} 则会在一行。无法把结果传到给sed处理。

第二步: sed ‘H;g’

[root@oldboy ~]# seq 9 | 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@oldboy scripts]# seq 9 | sed 'H;g' | awk -v RS='' '{print $1,$2,$3,$4,$5,$6,$7,$8,$9}'

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

小结:

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@oldboy scripts]# seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%d ",i)}'

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 [root@oldboy scripts]#

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

小结:

printf默认不会输出换行(与print有区别)

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

第二小小步

[root@oldboy scripts]# seq 9 | sed 'H;g' | awk  '

BEGIN{ RS=""}

> {

> for(i=1;i<=NF;i++)

>   { if (i==NF)

> char="\n"

> else

> char="\t"

> printf("%d %s",i,char)

>  }

> }'

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

简写为

[root@oldboy scripts]# seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%d %s",i,i==NF?"\n":"\t")}'

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

小结:

1.exp?exp1:exp2   这是常用的条件运算符。也是最特殊的一个三目运算符。如果前面两句你不懂。记住一句话:if (condition) then-body  else else-body 一样的

2.判断是否是一个字段的最后一个数 i==NF 来判断。

3.如果是最后一个则换行

4.不是则输出\t

最后一步

第一小步

配出

1*1

1*2 2*2

…………

的形式

[root@oldboy scripts]# seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%d*%d %s",i,NR,i==NF?"\n":"\t")}'

1*1

1*2     2*2

1*3     2*3     3*3

1*4     2*4     3*4     4*4

1*5     2*5     3*5     4*5     5*5

1*6     2*6     3*6     4*6     5*6     6*6

1*7     2*7     3*7     4*7     5*7     6*7     7*7

1*8     2*8     3*8     4*8     5*8     6*8     7*8     8*8

1*9     2*9     3*9     4*9     5*9     6*9     7*9     8*9     9*9

最后一小步

计算结果

[root@oldboy scripts]# seq 9 | sed 'H;g' | awk -v RS='' '{for(i=1;i<=NF;i++)printf("%d*%d=%d %s",i,NR,i*NR,i==NF?"\n":"\t")}'

1*1=1

1*2=2   2*2=4

1*3=3   2*3=6   3*3=9

1*4=4   2*4=8   3*4=12  4*4=16

1*5=5   2*5=10  3*5=15  4*5=20  5*5=25

1*6=6   2*6=12  3*6=18  4*6=24  5*6=30  6*6=36

1*7=7   2*7=14  3*7=21  4*7=28  5*7=35  6*7=42  7*7=49

1*8=8   2*8=16  3*8=24  4*8=32  5*8=40  6*8=48  7*8=56  8*8=64

1*9=9   2*9=18  3*9=27  4*9=36  5*9=45  6*9=54  7*9=63  8*9=72  9*9=81

本文章版权归老男孩教育所有。转载请注明出处。有任何疑问可以随时给我们网站留言。

本文链接:http://www.oldboyedu.com/tuijian_wenzhang/index/id/75.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值