在Perl的一个目录中读取相同的扩展名多个文件

时间:2013-08-21 21:26:56

标签: perl loops fastq

我目前在一个目录中读取文件时遇到问题。 我需要将所有fastq文件放在一个文件中,然后为每个文件运行脚本,然后将新文件放在'Edited_sequences'文件夹中。 我的一个脚本是

perl -ne '$i++; if($i<80001){print}' BM2003_TCCCAGAACAAC_L001_R1_001.fastq > ./Edited_sequences/BM2003_TCCCAGAACAAC_L001_R1_001.fastq

一个fastq文件中的前80000行然后输出结果。 现在例如我有2000个fastq文件,然后我需要复制和粘贴2000次。 我知道有一个针对这种情况的glob命令套装,但我只是不知道如何处理它。 请帮帮我。

3 个答案:

答案 0 :(得分:0)

您可以使用perl为您复制/粘贴,第一个参数*.fastq都是fastq文件,第二个./Edited_sequences是新文件的目标文件夹,

perl -e '$d=pop; `head -8000 "$_" > "$d/$_"` for @ARGV' *.fastq ./Edited_sequences

答案 1 :(得分:0)

glob为您提供与特定表达式匹配的文件名数组。它经常与<>括号一起使用,很像读取输入(您可以将其视为从目录中读取文件)。

这是一个简单的例子,它将打印当前目录中每个“.fastq”文件的名称:

print "$_\n" for <*.fastq>;

重要的部分是<*.fastq>,它为我们提供了一个与该表达式匹配的文件名数组(在本例中为文件扩展名)。如果您需要更改Perl脚本正在使用的目录,可以使用chdir

从那里,我们可以根据需要处理您的文件:

while (my $filename = <*.fastq>) {
    open(my $in, '<', $filename) or die $!;
    open(my $out, '>', "./Edited_sequences/$filename") or die $!;

    for (1..80000) {
        my $line = <$in>;
        print $out $line;
    }
}

答案 2 :(得分:0)

您有两种选择:

  • 使用Perl读取2000个文件并将其作为程序的一部分运行
  • 使用命令行管理程序将每个2000文件传递到命令行

这是bash替代方案:

for file in *.fastq
do
    perl -ne '$i++; if($i<80001){print}' "$file" > "./Edited_sequences/$file"
done

您的相同Perl脚本,但shell会查找每个文件。此应该工作,而不是重载命令行。 bash中的for循环,如果传递给glob可以正确扩展它们。

但是,我总是建议您不要实际执行命令,而是将生成的命令回显到文件中:

for file in *.fastq
do
    echo "perl -ne '\$i++; if(\$i<80001){print}' \
\"$file\" > \"./Edited_sequences/$file\""    >> myoutput.txt
done

然后,您可以查看myoutput.txt以确保它在您真正造成任何真正伤害之前看起来很好。一旦确定myoutput.txt是一个好文件,就可以将其作为shell脚本执行:

$ bash myoutput.txt