2012-03-28 11 views
0

Ich versuche, eine Mustererkennung in Perl-Code zu erreichen. Ich werde ein Beispiel geben, damit es leichter erklärt werden kann.pattern matching UNIX

Ich versuche, den folgenden Link in samtools zu verwenden -Blick:

ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data/HG00132/alignment/HG00132.mapped.SOLID.bfast.GBR.low_coverage.20111114.bam

samtools erlaubt nur eine bestimmte datasline mit folgenden Syntax abgerufen werden:

samtools -h sieht ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data/HG00132/alignment/HG00132.mapped.SOLID.bfast.GBR.low_coverage.20111114.bam 1 : 123-1234

Es gibt 1000 von ihnen und das 'GBR' Bit der Verbindung ändert sich. Also schrieb ich ein einfaches Perl-Skript und ersetzte den Link durch 'ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data/HG00132/alignment/HG00132.mapped.SOLID.bfast.*.bam'. Aber es erkennt den Link nicht. Ich habe mich also gefragt, ob es eine ähnliche Möglichkeit gibt, * in Unix zu verwenden, die Sie in der Mitte des Textes und nicht am Ende verwenden können. Deshalb möchte ich GBR mit einem Stern ersetzen und halten auch die ‚bam‘ Bit am Ende des Dateinamens (ich brauche nicht um die Datei herunterzuladen.)

Danke im Voraus

+0

verbinden Sie diesen FTP-Server über die Befehlszeile, richtig? Dann denke ich, dass Sie versuchen können, get-Befehl mit dem Muster, das Sie wollen, zu verwenden. – tartar

+0

Hallo Tartar, ich möchte diese Zeile eigentlich in einem Perl-Code verwenden. Ich möchte die Datei nicht direkt herunterladen, aber benutze sie von diesem Link – user1007742

Antwort

1

Verwenden LWP FTP zu suchen. Da keine Hyperlinks vorhanden sind, müssen Sie die Liste analysieren, um zwischen den Dateien zu unterscheiden, die Sie spiegeln möchten. Shell-Globs wie * funktionieren nicht, aber Regex sind geeignet.

Nicht getestetes Beispiel: Sammeln aller bam URIs aus dem angegebenen Verzeichnis.

use File::Listing qw(parse_dir); 
use LWP::UserAgent qw(); 

my @bam_files; 

my $base = 'ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data/HG00132/alignment/'; 
my $ua = LWP::UserAgent->new; 
my $index = $ua->get($base); 
for my $entry (parse_dir $index->decoded_content) { 
    my $filename = $entry->[0]; 
    next unless $filename =~ /bam$/; 
    push @bam_files, $base . $filename; 
} 

Es ist unmöglich, eine FTP-Datei zu verwenden, ohne sie herunterzuladen ersten (method get in LWP::UserAgent sehen). Dies bedeutet nicht, dass es auch auf dem lokalen Dateisystem gespeichert wird (das wäre die Methode mirror).

samtools müssen dies auch hinter den Kulissen tun, vielleicht mithilfe von Protokollerweiterungen, um nur Bereiche herunterzuladen, nicht die vollständige Datei.

+0

Ich benutze die Daten von Samtools und Sie müssen nicht die eigentliche Datei herunterladen: samtools Ansicht -h ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data/HG00132/alignment/HG00132.mapped. SOLID.bfast.GBR.low_coverage.20111114.bam 1: 123-1234 – user1007742

+0

All diese Art von entscheidender Information gehört in die Frage, nicht als Kommentare verstreut. [Bearbeiten Sie die Frage] (http://stackoverflow.com/posts/9904013/edit) zu ändern. – daxim

+0

1. Dann würde ich vorschlagen, ein Perl [ftp] [1] -Modul zu verwenden, nicht zum Herunterladen der Datei, sondern Ausführen eines ls-Befehls, um alle Dateien aufzulisten. 2. Dann können Sie reguläre Ausdrücke verwenden, um alle nicht benötigten Dateien herauszufiltern, außer den erforderlichen. 3. Dann werden Sie an dieser Dateiliste gearbeitet. Führen Sie einen beliebigen Befehl in dieser Liste aus. [1]: http://perldoc.perl.org/Net/FTP.html – tartar

0

Von wget advanced usage examples :

You want to download all the GIFs from an HTTP directory. 
wget http://host/dir/*.gif doesn't work, since HTTP retrieval does not support 
globbing. In that case, use: 

wget -r -l1 --no-parent -A.gif http://host/dir/ 
+0

Danke, aber ich bin nicht genau nach wget. Ich möchte diese Zeile einen Perl-Code verwenden. – user1007742

+1

Sie sollten Ihre Frage mit dieser Anforderung aktualisieren. –