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