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}' 

首先他们代码思路是一样的;清晰易懂;这个就不要我来解释了;大牛就是大牛;不得不赞啊!

posted @ 2013-10-12 21:55  lottu  阅读(270)  评论(0)    收藏  举报