1. 程式人生 > >老男孩教育每日一題-第126天-通過shell腳本打印乘法口訣表

老男孩教育每日一題-第126天-通過shell腳本打印乘法口訣表

sed模式空間 保持空間 每日一題

老男孩教育每日一題-第126天-通過shell腳本打印乘法口訣表

問題背景:

生成9*9乘法表

[[email protected] ~]# 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

[[email protected] ~]# 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’

[[email protected] ~]# 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

小結:

技術分享

技術分享

了解根據上圖了解HGx用法即可。

第三步:

第一小步:
[[email protected] 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.
每個記錄(每行)被一個或多個空行分隔。文件中的換行都被忽略。

第二小步:
第一小小步
[[email protected] 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 [[email protected] scripts]#

改為循環輸出,可是卻都在一行。

小結:
  1. printf默認不會輸出換行(與print有區別)

  2. 需要手動按照條件(每個字段(record)的最後一列))輸出換行”\n”

第二小小步
[[email protected] 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

簡寫為

[[email protected] 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 
…………

的形式

[[email protected] 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
最後一小步

計算結果

[[email protected] 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

小結:

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

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

備註

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

對於題目和答案的任何疑問,請在博客評論區留言
往期題目索引

http://lidao.blog.51cto.com/3388056/1914205

本文出自 “李導的博客” 博客,請務必保留此出處http://lidao.blog.51cto.com/3388056/1961524

老男孩教育每日一題-第126天-通過shell腳本打印乘法口訣表