老男孩教育每日一題-第126天-通過shell腳本打印乘法口訣表
老男孩教育每日一題-第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]#
改為循環輸出,可是卻都在一行。
小結:
printf默認不會輸出換行(與print有區別)
需要手動按照條件(每個字段(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
小結:
了解sed的模式空間,了解就行能看懂就行了。
awk的NR=””空的用法。
備註
今天是每日一題陪伴大家的第126天,期待你的進步。
對於題目和答案的任何疑問,請在博客評論區留言。
往期題目索引
http://lidao.blog.51cto.com/3388056/1914205
本文出自 “李導的博客” 博客,請務必保留此出處http://lidao.blog.51cto.com/3388056/1961524
老男孩教育每日一題-第126天-通過shell腳本打印乘法口訣表