awk处理案例十三--关于边界问题
正如需求如下:
能否实现这样的功能,如下数据 6 7 8 9 10 16 17 22 23 24 25 26 28 29 30 能输出每段连续数字的开始和结束数字,如 6 10 16 17 22 26 28 30
【代码】
我提供2种写法:
写法一:
awk '{print $0"\n"$0+1}' file|uniq -u|awk '{print;getline d;print d-1}'|uniq
【解析】
1:利用$0"\n"$0+1;例如前两行会打印出6"\n"7,7"\n"8 ;再利用uniq -u来去除有重复的所有行!有点巧;但未必是最好的!
写法二:
01.awk '{a[NR]=$0}END{for(i=2;i<=NR;i++)if(a[i]+1==a[i+1]&&((a[i]==a[i-1]+1)||(! a[i-1]))){delete a[i]};for(i=1;i<=asort(a,c);i++)print c[i]}' file
【解析】
例如6,7,8,9,10,16这些行;从7开始;那个if里面的条件就是(7+1==8)且((7==6+1)或者(! 6));可知(7+1==8)和(7==6+1)为真;就删除a[7];若等于八呢?自己分析下;我当时的思路就是这样;这样在一个数组中可以把7,8,9删除;在打印数组a;可以得到想要的结果了!
【大牛们的代码】
首先是关阴月飞;个人很膜拜他;他的代码是这样
01.awk 'NR<2{print a=$0;next}a+1!=$0{print a"\n"$0}{a=$0}END{print}' file
再着是dn833的代码
01.awk '{if(v!=$0-1)print v"\n"$0}{v=$0}'
首先他们代码思路是一样的;清晰易懂;这个就不要我来解释了;大牛就是大牛;不得不赞啊!

浙公网安备 33010602011771号