root@ecs-beijing1:~# 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
对代码进行拆解:
root@ecs-beijing1:~# seq 9
1
2
3
4
5
6
7
8
9
seq打印出一个序列,作为管道的输入,进入sed进行处理:
sed命令中:
pattern space相当于车间sed把流内容在这里处理。
hold space相当于仓库,加工的半成品在这里临时储存。
这里需要注意的是每行记录前都是有一个空行的。在excel表中把sed流程推演一下:(P代表pattern space;H代表hold space)
可以看出,每行记录数=所在行数;由于经过了+H,带上了一个\n的符号,后面用RS将其换掉,否则显示出来的是60行而不是需要的9行。
至此原料数据有了,后面是用awk进行格式化输出:
for(i=1;i<=NF;i++)printf("%dx%d=%d%s", i, NR, i*NR, i==NR?"\n":"\t")
内建变量
变量
描述
NF
一条记录的字段的数目
NR
已经读出的记录数,就是行号,从1开始