2012-03-28 284 views
0

我正试图在perl代码中实现模式匹配。我会举一个例子,以便更容易解释。模式匹配UNIX

我试图使用samtools下面的链接 - 视图:

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

samtools只允许特定的datasline与下面的语法进行检索:

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

它们有1000个,链接的'GBR'位发生变化。所以我写了一个简单的perl脚本,并用'ftp://ftp.1000genomes.ebi.ac.uk/vol1/ftp/data/HG00132/alignment/HG00132.mapped.SOLID.bfast.*.bam'替换链接。但它不承认链接。所以我想知道是否有类似的方式在unix中使用*,你可以在文本中间使用,而不是在最后使用。所以我想用明星来代替GBR,也保持“咣当”位在文件名的远端(我并不需要下载的文件)

预先感谢您

+0

您是否使用命令行连接到此ftp服务器,对不对?那么我想你可以尝试使用get命令和你想要的模式。 – tartar 2012-03-28 08:50:31

+0

鞑靼,我想在Perl代码中使用这行。我不想直接下载该文件,但从该链接使用它 – user1007742 2012-03-28 09:15:15

回答

1

使用LWP浏览FTP。没有超链接,所以你必须解析列表来区分你想要镜像的文件。像*这样的壳体不起作用,但是正则表达式是合适的。

未经测试的示例:收集来自指定目录的所有bam URI。

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

如果不先下载FTP文件,则无法使用FTP文件(请参阅method get in LWP::UserAgent)。这并不意味着将其保存在本地文件系统上(这将是方法mirror)。

samtools也必须在幕后执行此操作,也许使用协议扩展来下载范围,而不是完整的文件。

+0

我正在使用Samtools的数据切片,而且您不需要下载实际的文件:samtools view -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 2012-03-28 09:56:04

+0

所有这些重要信息都属于这个问题,而不是散布在评论中。 [编辑问题](http://stackoverflow.com/posts/9904013/edit)进行修改。 – daxim 2012-03-28 10:06:54

+0

1.然后,我建议使用perl [ftp] [1]模块,而不是下载文件,但运行ls命令列出所有文件。 2.然后,您可以使用正则表达式来过滤掉所有不必要的文件,但需要的文件。 3.然后,你将在该文件列表上工作。在该列表上运行您想要的任何命令。 [1]:http://perldoc.perl.org/Net/FTP.html – tartar 2012-03-28 15:25:30

0

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

谢谢,但我不完全在wget之后。我想用这行perl代码。 – user1007742 2012-03-28 09:11:12

+1

你应该用这个要求更新你的问题。 – 2012-03-28 09:13:09