提取文件里不相交的范围(去掉有交集的行)

940阅读 0评论2010-11-03 expert1
分类:系统运维

格式如下:
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的第4段符合。

A        207        236

简单理解为,只要文件里任意两行有交集,则舍弃。

易懂版(效率低,需要展开$2~$3)

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

或者更加难懂的:)

  1. [root@linux ~]# awk 'NR==FNR{ a[$1" "$2" "$3]=$1; line++ }NR>FNR{

  2.         counter=0
  3.      
  4.         for(i in a)

  5.         {
  6.            split(i,m," ")
  7.  
  8.           if($3m[3] || (m[2]==$2 && m[3]==$3))

  9.                   counter++
  10.                                   
  11.           else next
  12.                                      
  13.           if(counter == line)

  14.           print $0

  15.         }

  16. }' file file
  17. A 207 236

上一篇:awk--最大子段和(算法)
下一篇:蛋疼的安装脚本--没有任何技术含量