提取不相交的唯一的范围

格式如下:
  1. A        20        56
  2. B        40        68
  3. A        207        236
  4. C        136        152
  5. B        86        121
  6. A        95        110
  7. B        161        186
  8. A        145        170
第一列为元素,可以理解为分布在直线上的线段,第二列和第三列分别为起点和终点,同一元素可以有多段,现要找出独属于A的一段,即起止点范围内没有其他的元素出现,上述数据即A的第4段符合。
  1. A        207        236

sort -k2,2n -k 3n,3 urfile|awk -f scr.awk

# cat scr.awk

awk '{if(NR==1){p=$0;max=$3}
if($2<=max){max=$3<max?$3:max;if(!f)f=!f}
else{if(f)f=!f;else print p;max=$3;p=$0}
}
END{if(!f)print p}'

说真的这个比较麻烦,特别这个flag用的很巧妙。

来个易懂的

awk '{a[$1" "$2" "$3];for(i=$2;i<=$3;i++)b[i]++}END{for(j in a){split(j,m," ");flag=1;for(k=m[2];k<=m[3];k++)if(b[k]>1){flag=0;break}}if(flag==1){print j}}'

作者: expert1   发布时间: 2010-11-03