-1

我目前在读取一个目录中的文件时遇到问题。我需要将所有 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 命令套装,但我只是不知道如何处理。请帮帮我。

4

3 回答 3

0

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

perl -e '$d=pop; `head -8000 "$_" > "$d/$_"` for @ARGV' *.fastq ./Edited_sequences
于 2013-08-21T21:43:24.500 回答
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;
    }
}
于 2013-08-21T21:57:14.243 回答
0

你有两个选择:

  • 使用 Perl 读取 2000 个文件并将其作为程序的一部分运行
  • 使用 Shell 将每个 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
于 2013-08-22T00:26:06.680 回答