Perl: agregar guiones bajos y ordenar filas

Perl: agregar guiones bajos y ordenar filas

Como soy biólogo y nuevo en Perl, me gustaría recibir ayuda de un experto en Perl.

entrada de gato.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"

Mi salida.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
###

Mi resultado esperado

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
###

Me gustaría la ayuda de un experto en Perl para reformatear mi salida en el código Perl que se proporciona a continuación.

1.Me gustaría agregar una puntuación inferior a la matriz [0] en la salida (es decir, gi371443188gbJH5566721_extraction_reversed como gi_371443188_gb_JH5566721)

2.ordenar las filas de CDS en orden ascendente según los valores de las columnas 3 y 4 del resultado (ver resultado esperado)

3.Agregue una nueva fila en la parte superior del archivo como gen gi_371443188_gb_JH556672.1 con el valor mínimo y máximo de las filas CDS (consulte el resultado esperado)

Mi código Perl se proporciona a continuación.

#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";

Respuesta1

Esto lo hará (es decir, mi salida coincide con la suya), aunque no es la más limpia.

Las expresiones regulares para agregar guiones bajos probablemente se puedan combinar. Pero para la clasificación, debe enviar todas las líneas de salida a una lista y luego ordenarlas (también se puede hacer en el lado entrante, pero aún así las necesita todas en un solo lugar primero).

--- 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";

información relacionada