问题描述
提供给我的perl脚本包含:
use strict;
open(IN1,"<".$ARGV[0]);
open(IN2,"<".$ARGV[1]);
open(OUT,">".$ARGV[2]);
开头,应该在多个fastq文件上运行。我不确定要使用哪个命令行,以便使perl脚本遍历文件夹中的多个文件。
我尝试过的行之一是:
perl script.pl *.fastq.gz
解决方法
该程序的调用方式如下:
$ program.pl input1.dat input2.dat output.dat
因此,您目前需要为其提供两个输入文件和一个输出文件。
如果要更改它以处理两个以上的输入文件,那么(大概)您仍然需要将其传递给输出文件。可能是这样的:
$ program.pl *.fastq.gz output.dat
然后在代码中,您可以编写:
my $outfile = pop @ARGV;
my @infiles = @ARGV;
您还必须更改打开文件句柄的代码,因为当前已对其进行硬编码以使用两个输入文件和一个输出文件。
但是,这里还有其他需要考虑的问题。也许根本不打开任何文件。而是将您的代码编写为Unix样式的过滤器。
$ program.pl input_files* > output.dat
然后只需从<>
(空文件输入运算符)中读取并写入STDOUT
。
基于问题中的三行代码,您应该给它三个参数:
script.pl [input file 1] [input file 2] [output file]
尝试使用通配符不太可能正常工作(除非正确的三个文件位于目录中,并且在目录列表中按正确的顺序排序)。
更糟糕的是,它可能损坏了与*.fastq.gz
相匹配的第三个文件,因为脚本可能试图向其中写入输出,除非脚本进行了足够的错误检查以发现错误的编号。参数并中止-并且考虑到您发布的三个open
语句中没有错误检查,因此似乎不太可能进行这样的检查。
运行脚本的典型用法是
perl script.pl in.1.fastq in.2.fastq out_file
# or:
perl script.pl in.1.fastq.gz in.2.fastq.gz out_file
通常,两个输入文件分别读取1和2个fastq文件,例如在Illumina测序仪上运行配对末端测序的结果。
在这种情况下使用*
可能会出现问题,因为它可能会扩展到2个以上的文件(不是您想要的文件)。
要运行一对以上的fastq文件,请执行以下操作。制作一个每行具有1个样本名称的文件,例如文件samples.txt
,例如这样(我假设样本名称中没有空白):
sample_a
sample_b
...
然后在每个样本上运行脚本,读取1和读取2:
cat samples.txt | xargs -n1 -I{} perl script.pl {}.1.fastq {}.2.fastq {}.out
在这里,xargs -n1
:对每个1个字符串(在这里,对于每一行)执行命令,-I{}
:将单词分配给{}
,然后我们将其重新用作文件名。