这是此网站上my very first question的扩展名。
现在我有以下代码:
conda install netCDF4
我在最后根据Unix命令的要求成功地将正向和反向fastq文件配对。现在,我一直坚持如何相互调用对的各个组件。
我已经考虑通过输入密钥作为用户输入来访问哈希,但是这些数字是在脚本中随机生成的,我不想在运行之前强制用户输入这些值Unix脚本。
另外,我检查过的所有示例都已经在哈希中提供了固定数量的密钥。根据用户想要合并的文件数量,散列中的密钥数量也会有所不同。
我知道我想创建一个循环,以便命令可以多次运行;程序FLASH一次只能接受一个正向和反向fastq文件。因此,必须循环正向和反向fastq读取,以便处理每个读取。
如何在将它们组合成一个哈希后,取出我想要使用的特定文件?
答案 0 :(得分:1)
我对你所需要的最好的猜测是将给定目录中的所有.fastq
文件配对,并为每对调用flash
实用程序
您自己的代码存在许多问题,并且您似乎在%pairs
哈希中保留了您需要的更多信息(我认为您需要的只是文件名,样本ID和格式)所以我写了这个
我还使用了一个简单的glob
代替opendir
,readdir
,closedir
这似乎是一个更好的选择
我已经尽可能地测试了它,看起来很好
#!/usr/bin/perl
use strict;
use warnings;
use File::Basename qw/ basename /;
my $flash = '/usr/local/flash/flash';
print "Please provide the directory containing\n";
print "the fastq files from your Illumina MiSeq run: ";
my $fastq_file_dir = <STDIN>;
chomp $fastq_file_dir;
print "Please provide the minimum overlap between the two reads in bp: ";
my $min_overlap = <STDIN>;
chomp $min_overlap;
print "Please provide the maximum overlap between the two reads in bp: ";
my $max_overlap = <STDIN>;
chomp $max_overlap;
print "Now provide the output directory for your merged fastq reads: ";
my $out_dir = <STDIN>;
chomp $out_dir;
my @files = glob "$fastq_file_dir/*.fastq";
my %pairs;
for my $fastq_file ( @files ) {
my $file = basename $fastq_file;
my ($sample_id, $format) = (split /_/, $file)[0,3];
$pairs{ $sample_id }{ $format } = $file;
}
printf "Processing %d pairs of FASTQ files\n\n", scalar keys %pairs;
chdir $fastq_file_dir;
for my $sample ( sort keys %pairs ) {
my $pair = $pairs{$sample};
my ($forward, $reverse) = @{$pair}{qw/ R1 R2 /};
print "Forward: $forward\n";
print "Reverse: $reverse\n";
print "\n";
my $cmd = qq{$flash $forward $reverse -m $min_overlap -M $max_overlap -d $out_dir};
system $cmd;
}