分类: 系统运维
2014-05-12 13:49:31
[user@myhost tmp]$ more d
A 1 10000
B 1 10001
B 10001 40000
a 2 5
x 10 10
c 1 3
d 5 6
[user@myhost tmp]$ more c
A 5 55
A 56 56
A 57 57
A 1024 1024
A 1025 1078
A 2047 2047
A 6658 6670
A 6671 6671
B 247 249
B 1024 1078
B 5547 5591
B 15547 25591
a 2 2
a 5 5
b 3 9
c 1 1
d 3 5
x 9 10
代码如下,复杂的逻辑关系,慢慢分析吧,已经经过严格测试,逻辑关系应该是没问题的。
awk 'NR == FNR{
a[$1" "$2" "$3]=$1 }
NR>FNR{
for(i in a)
{ flag=0
if(a[i]==$1)
{
split(i ,b ," ")
if($2 <= b[2] && $3 >= b[3])
flag= 1
if ($2 >b[2] && $3 < b[3] )
{
a[a[i]" "b[2] " "($2 - 1)] =a[i]
a[a[i]" "($3 + 1) " " b[3]] =a[i]
flag=1
}
if ($2 > b[2] && $2 <= b[3] && $3>=b[3])
{
a[a[i]" "b[2] " "($2 - 1)] = a[i]
flag= 1
}
if ($3 >= b[2] && $3 < b[3] && $2<= b[2])
{
a[a[i]" "($3 + 1) " " b[3]] = a[i]
flag= 1
}
}
if (flag)
delete a[i]
}
}
END {
for(i in a)print i
}' f1 f2
注意要把$1,$2,$3做index防止ID不同,但坐标范围相同冲掉上一个index的情况,此外,当split之后,必须要加上a[i],否则数组长度是2,2次分裂的时候出现b[3]为空的情况。