![Perl: agregar guiones bajos y ordenar filas](https://rvso.com/image/23939/Perl%3A%20agregar%20guiones%20bajos%20y%20ordenar%20filas.png)
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";