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