一个序列1开始到100结束,其中步长是4,打印41前面的三个数字
seq 1 4 100 |awk '/\<41\>/{for(i=NR-3;i<NR;i++)print a[i%3]}{a[NR%3]=$0}'
33
37
29
解析:如果是打印三个数字的话,那么就是循环三次,所以后面用到了循环三次。再有就是最后面的对序列里面的子进行三个取余的排序,非常简便。下面进行分解操作:
1 1 a[1] 1
2 5 a[2] 5
3 9 a[0] 9
4 13 a[1] 13
5 17 a[2] 17
........
一次类推,等到匹配到41的时候不在执行最后面的a[NR%3]=$0这个语句,所以这时候输出的就是41前面的那三个数字。所以输出了29 33 37三个。