在多个文件上使用perl脚本的命令行

问题描述

提供给我的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{}:将单词分配给{},然后我们将其重新用作文件名。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...