- 论坛徽章:
- 7
|
回复 54# pitonas
好吧,其实我一般很懒得帖现成代码的,下面是一个demo我刚随便写的,里面有很多重复代码,感兴趣的人可以对代码进行重构:
- #!/usr/bin/env perl
- use v5.18;
- use autodie;
- my $file1 = shift;
- my $file2 = shift;
- my $out_file = shift;
- open my $fh_in1, "<", $file1;
- open my $fh_in2, "<", $file2;
- open my $fh_out, ">", $out_file;
- my $line = <$fh_in1>;
- my ($current_scaffold1, $current_start1, $current_end1) = split /\s+/, $line;
- $line = <$fh_in2>;
- my ($current_scaffold2, $current_start2, $current_end2) = split /\s+/, $line;
- while (1) {
- unless ($current_scaffold1 eq $current_scaffold2) {
- say $fh_out join "\t", $current_scaffold1, $current_start1, $current_end1;
- last if eof $fh_in1;
- $line = <$fh_in1>;
- ($current_scaffold1, $current_start1, $current_end1) = split /\s+/, $line;
- next;
- }
- if ($current_start2 > $current_end1) {
- say $fh_out join "\t", $current_scaffold1, $current_start1, $current_end1;
- last if eof $fh_in1;
- $line = <$fh_in1>;
- ($current_scaffold1, $current_start1, $current_end1) = split /\s+/, $line;
- next;
- }
- if ($current_start1 > $current_end2) {
- if (eof $fh_in2) {
- say $fh_out join "\t", $current_scaffold1, $current_start1, $current_end1;
- last;
- }
- $line = <$fh_in2>;
- ($current_scaffold2, $current_start2, $current_end2) = split /\s+/, $line;
- next;
- }
- say $fh_out join "\t", $current_scaffold1, $current_start1, $current_start2 - 1 unless $current_start1 == $current_start2;
- if ($current_end1 == $current_end2) {
- last if eof $fh_in1;
- $line = <$fh_in1>;
- ($current_scaffold1, $current_start1, $current_end1) = split /\s+/, $line;
- # the following code is unneccesary, but you can still uncomment it if you
- # so desire
- # if (eof $fh_in2) {
- # say $fh_out join "\t", $current_scaffold1, $current_start1, $current_end1;
- # last;
- # }
- #
- # $line = <$fh_in2>;
- # ($current_scaffold2, $current_start2, $current_end2) = split /\s+/, $line;
- next;
- }
- if ($current_end1 < $current_end2) {
- last if eof $fh_in1;
- # If you so desire, you can uncomment the following line.
- # $current_start2 = $current_end1 + 1;
- $line = <$fh_in1>;
- ($current_scaffold1, $current_start1, $current_end1) = split /\s+/, $line;
- next;
- }
- $current_start1 = $current_end2 + 1;
- # the following code is unneccesary, but you can still uncomment it if you
- # so desire
- # if (eof $fh_in2) {
- # say $fh_out join "\t", $current_scaffold1, $current_start1, $current_end1;
- # last;
- # }
- #
- # $line = <$fh_in2>;
- # ($current_scaffold2, $current_start2, $current_end2) = split /\s+/, $line;
- }
- close $fh_in1;
- close $fh_in2;
- close $fh_out;
复制代码 |
|