Chr1 1000 4000 A1 Chr1 12000 32000 A2,A3,B1,B2 Chr1 42000 44000 A4 #### # bedtools closest -a File1 -b File2 -d Chr1 1000 4000 A1 Chr1 12000 18500 B1 8001 Chr1 15000 22000 A2 Chr1 12000 18500 B1 0 Chr1 30000 32000 A3 Chr1 28000 29000 B2 1001 Chr1 42000 44000 A4 Chr1 28000 29000 B2 13001 #### # bedtools closest -a File1 -b File2 -d | sort -k9,9n Chr1 15000 22000 A2 Chr1 12000 18500 B1 0 Chr1 30000 32000 A3 Chr1 28000 29000 B2 1001 Chr1 1000 4000 A1 Chr1 12000 18500 B1 8001 Chr1 42000 44000 A4 Chr1 28000 29000 B2 13001 #### # bedtools closest -a ta -b tb -d | sort -k9,9n | perl -ne 'BEGIN{$limitedDistance=10000; use List::Util qw(min max); my %hash=();} @a=split; $idA=$a[3]; $idB=$a[7]; $dis=$a[8]; if($hash{$idA} and !$hash{$idB}){print "$a[4]\t$a[5]\t$a[6]\t$a[7]\n"; $hash{$idB}=1;} if($hash{$idB} and ! $hash{$idA}){print "$a[0]\t$a[1]\t$a[2]\t$a[3]\n"; $hash{$idA}=1; } if(!$hash{$idA} and ! $hash{$idB}){ if($dis > $limitedDistance){ print "$a[0]\t$a[1]\t$a[2]\t$a[3]\n"; print "$a[4]\t$a[5]\t$a[6]\t$a[7]\n";} else{ $start=min($a[1], $a[5]); $end=max($a[2],$a[6]); print "$a[0]\t$start\t$end\t$a[3],$a[7]\n"; $hash{$idA}=1; $hash{$idB}=1; } } ' | sort -k1,1 -k2,2n #### Chr1 1000 4000 A1 Chr1 12000 22000 A2,B1 Chr1 28000 32000 A3,B2 Chr1 42000 44000 A4 #### use warnings; use strict; use List::Util qw(min max); my %hash=(); my $limitedDistance = 10000; open(INP, "bedtoolsOutput"); while() { my @a=split; my $idA=$a[3]; my $idB=$a[7]; my $dis=$a[8]; if($hash{$idA} and !$hash{$idB}){ print "$a[4]\t$a[5]\t$a[6]\t$a[7]\n"; $hash{$idB}=1; } if($hash{$idB} and ! $hash{$idA}){ print "$a[0]\t$a[1]\t$a[2]\t$a[3]\n"; $hash{$idA}=1; } if(!$hash{$idA} and ! $hash{$idB}){ if($dis > $limitedDistance) { print "$a[0]\t$a[1]\t$a[2]\t$a[3]\n"; print "$a[4]\t$a[5]\t$a[6]\t$a[7]\n"; } else { my $start=min($a[1], $a[5]); my $end=max($a[2],$a[6]); print "$a[0]\t$start\t$end\t$a[3],$a[7]\n"; $hash{$idA}=1; $hash{$idB}=1; } } }