Perl - Unterstrich hinzufügen und Zeilen sortieren

Perl - Unterstrich hinzufügen und Zeilen sortieren

Da ich Biologe bin und neu in Perl bin, würde ich gerne Hilfe von einem Perl-Experten bekommen

Katze Eingabe.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"

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

Meine erwartete Ausgabe

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

Ich benötige die Hilfe eines Perl-Experten beim Umwandeln meiner Ausgabe in den unten angegebenen Perl-Code.

1.Ich möchte in der Ausgabe dem Array[0] einen Unterpunktwert hinzufügen (also gi371443188gbJH5566721_extraction_reversed als gi_371443188_gb_JH5566721)

2. Sortieren Sie die Zeilen des CDS in aufsteigender Reihenfolge basierend auf den Werten der Spalten 3 und 4 der Ausgabe (siehe erwartete Ausgabe).

3. Fügen Sie oben in der Datei eine neue Zeile als „gi_371443188_gb_JH556672.1“-Gen mit dem Mindest- und Höchstwert der CDS-Zeilen hinzu (siehe erwartete Ausgabe).

Mein Perl-Code ist unten angegeben.

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

Antwort1

Dies reicht aus (d. h. meine Ausgabe stimmt mit Ihrer überein), obwohl es nicht ganz sauber ist.

Die regulären Ausdrücke zum Hinzufügen der Unterstriche können wahrscheinlich kombiniert werden. Aber zum Sortieren müssen Sie alle Ihre Ausgabezeilen in eine Liste einfügen und diese dann sortieren (dies könnte auch auf der eingehenden Seite erfolgen, aber Sie müssen trotzdem zunächst alles an einem Ort haben).

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

verwandte Informationen