- 论坛徽章:
- 16
|
本帖最后由 expert1 于 2019-02-23 20:06 编辑
回复 12# 小小脑
我之前的逻辑也有些问题,忘了区间的合并问题。
处理了一下数据。
awk -v OFS="\t" '$2>$3{print $1,$3,$2,$4,"tag"}$2<$3{print}' file > file.new
上面是如果$2>$3, 交换,然后添加一个标记。
然后数据会出现
Chr5 22618110 22618266 291 tag # 这个标记就是说$3<$2的列。
再sort -k1,1 -k2n 让$2升序。这样比较好比较了。因为$2升序排列后,下一行是 大于或者等于 上一行。
最后
awk 'NR==1{temp=$0;key=$1;begin=$2;end=$3;max=$4;range=$3-$2 }NR>1{
if(key==$1 ) {
#$2>end, 由于$2<=$3,那么$3默认就是大于end, 不重合了。
if( $2 >end ) {
print temp;
temp=$0;key=$1;begin=$2;end=$3;max=$4;range=$3-$2
}
else {
# 如果重合,而且$3超出上一个值,要赋给end.
if ($3 >end ) end=$3
# 取最大的$4
if ( max<=$4 ) {max=$4; temp=$0 }
# 值相同,取最大区间的行
if ( max==$4 ){
if (range <($3-$2) ) {max=$4; temp=$0}
}
}
}
else {
print temp;
temp=$0;key=$1;begin=$2;end=$3;max=$4;range=$3-$2
}
}END{print temp}' file
Chr1 2157109 2157660 808
Chr1 3360540 3360660 219 tag
Chr1 3780765 3781512 1360
Chr1 3785281 3785720 797
Chr1 4410950 4411120 233 tag
Chr1 5691756 5691938 300
Chr1 6302607 6303156 776
Chr1 6538418 6538589 244
Chr1 6543373 6543536 230
Chr1 6704196 6704365 231
Chr1 6709162 6709324 230
Chr1 7714707 7715145 767
Chr1 7717356 7718103 1282
Chr1 7722108 7722547 769
Chr1 10696714 10696898 320
Chr1 10916029 10916151 159
Chr1 11793805 11794079 508
Chr1 12570622 12570840 300 tag
Chr1 12664517 12664679 263 tag
Chr1 12673153 12673968 1219 tag
Chr1 12679988 12680165 246 tag
Chr1 12845527 12845721 268
Chr1 13181862 13182085 326 tag
Chr1 13186958 13187277 562
Chr1 13211963 13212054 154 tag
Chr1 13212867 13213084 322 tag
Chr1 13507780 13508921 1485 tag
Chr1 13514806 13515963 1594 tag
Chr1 13644552 13644710 230 tag
Chr1 13654168 13654366 279 tag
Chr1 13659274 13660438 1899
Chr1 13666402 13667557 1853
Chr1 13711662 13712500 1282
Chr1 13748252 13748442 265 tag
Chr1 13768440 13768755 424 tag
Chr1 13781513 13781647 182
Chr1 13785915 13786614 1131
Chr1 13786687 13787958 2104
Chr1 13793494 13794661 1947
Chr1 13796499 13798261 2381 tag
Chr1 13818567 13818942 641
Chr1 13823513 13823888 641
Chr1 13862959 13864719 2904 tag
......
自己再处理一下,把tag的行,$3,$2交换一下就可以了。
|
|