Perl- Adicionando linhas de sublinhado e ordenação

2

Como sou biólogo e novo no perl, gostaria de obter ajuda do perl expert

cat input.txt

##gff-version 2
##source-version geneious 5.6.3
gi371443188gbJH5566721_extraction_reversed  Geneious    CDS 1043    1132    .    +   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed  Geneious    CDS 2063    2260    .    +   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed  Geneious    CDS 2336    2593    .    +   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed  Geneious    CDS 3474    3633    .    +   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed  Geneious    extracted region    1   13933   .   +   .   Name=Extracted region from gi|371443188|gb|JH556672.1|;Extracted interval="2010140 <- 2024072"

Meu output.txt

gi371443188gbJH5566721_extraction_reversed  CDS 2023029 2022940 .    -   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed  CDS 2022009 2021812 .    -   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed  CDS 2021736 2021479 .    -   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi371443188gbJH5566721_extraction_reversed  CDS 2020598 2020439 .    -   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
###

Minha saída esperada

gi_371443188_gb_JH5566721  gene    2020598 2023029 .     -   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.13412469767431
gi_371443188_gb_JH5566721   CDS 2020598 2020439 .    -   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi_371443188_gb_JH5566721   CDS 2021736 2021479 .    -   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi_371443188_gb_JH5566721   CDS 2022009 2021812 .    -   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
gi_371443188_gb_JH5566721   CDS 2023029 2022940 .    -   .   Name=Xm ITGB3;created by=User;modified by=User;ID=Pa0FVoXpt/GgL1I/VO7LY0UlFAc.1341246976743.1
###

Eu gostaria da ajuda do perl expert em reformatar minha saída em código perl abaixo.

1.Eu gostaria de adicionar sob pontuação para matriz [0] na saída (ou seja, gi371443188gbJH5566721_extraction_reversed como gi_371443188_gb_JH5566721)

2.sortar linhas de CDS em ordem crescente com base nos valores de column3 & 4 da saída (consulte a saída esperada)

3.Adicione nova linha no topo do arquivo como gi_371443188_gb_JH556672.1 gene com mínimo & valor máximo de linhas de CDS (consulte a saída esperada)

Meu código Perl é fornecido abaixo.

#usr/bin/perl;

open(FH,"$ARGV[0]");

my %num="";
my %all="";
while(<FH>){
 chomp $_; 
   my @array=split("\t"); #print "$array[2]\n";
   if($array[2] eq "extracted region"){ 
   $array[8]=~/.*\w+=\"\d+ <- (\d+)"/gm; 
   $num{$array[0]}="$1";
   }
   if($array[2] eq "CDS"){
   $all{$array[0]}.="$_\n";
    }
    }

   foreach $i (keys %all){

    my @line=split "\n",$all{$i};
    for ($j=0;$j<=$#line;$j++){
    my @new_line=split "\t",$line[$j];
    my $pos1=$num{$i}-$new_line[3];
    my $pos2=$num{$i}-$new_line[4]; #print $num{$i}; exit;
    $new_line[6] =~ s/\+/-/g;
    print "$new_line[0]\t$new_line[2]\t$pos1\t$pos2\t$new_line[5]\t$new_line[6]\t$new_line[7]\t$new_line[8]\n";
    }
    }
    print "###\n";
    
por jack 13.07.2012 / 19:29

1 resposta

2

Isso fará isso (ou seja, minha saída corresponde à sua), embora não seja bem a mais limpa.

O regexp para adicionar os sublinhados provavelmente pode ser combinado. Mas para a classificação, você precisa empurrar todas as suas linhas de saída para uma lista e, em seguida, classificá-la (isso também pode ser feito no lado de entrada, mas você ainda precisa de tudo em um primeiro lugar).

--- test.pl~    2012-07-13 12:04:36.000000000 -0700
+++ test.pl 2012-07-13 12:17:58.000000000 -0700
@@ -1,4 +1,4 @@
-#usr/bin/perl
+#!/usr/bin/perl
 use strict;

 open(FH,"$ARGV[0]");
@@ -18,6 +18,7 @@
     }

    my $i;
+   my @output;
    foreach $i (keys %all){

     my @line=split "\n",$all{$i};
@@ -27,8 +28,15 @@
     my $pos1=$num{$i}-$new_line[3];
     my $pos2=$num{$i}-$new_line[4]; #print $num{$i}; exit;
     $new_line[6] =~ s/\+/-/g;
-    print "$new_line[0]\t$new_line[2]\t$pos1\t$pos2\t$new_line[5]\t$new_line[6]\t$new_line[7]\t$new_line[8]\n";
+    $new_line[0] =~ s/gi/gi_/;
+    $new_line[0] =~ s/gb/_gb_/;
+    $new_line[0] =~ s/_extraction_reversed//;
+    push @output, "$new_line[0]\t$new_line[2]\t$pos1\t$pos2\t$new_line[5]\t$new_line[6]\t$new_line[7]\t$new_line[8]\n";
     }
     }
+    @output = sort (@output);
+    foreach my $out (@output) {
+    print $out;
+    }
     print "###\n";
    
por 13.07.2012 / 21:23

Tags