gpt4 book ai didi

fasta - 如何从 perl 中的标准输入和文件进行透明 gzip 解压缩?

转载 作者:行者123 更新时间:2023-12-01 09:47:53 27 4
gpt4 key购买 nike

我已经编写了一些用于处理 FASTA/FASTQ 文件的脚本(例如 fastx-length.pl ),但想让它们更通用,并接受压缩和未压缩文件作为命令行参数和标准输入(以便当您向脚本扔随机文件时,脚本“正常工作”)。对我来说,同时处理未压缩和压缩文件(例如压缩读取文件、未压缩组装基因组)以及插入类似 <(zcat file.fastq.gz) 之类的文件是很常见的。很快就会变得烦人。

这是来自 fastx-length.pl 的示例 block 脚本:

...
my @lengths = ();
my $inQual = 0; # false
my $seqID = "";
my $qualID = "";
my $seq = "";
my $qual = "";
while(<>){
chomp; chomp; # double chomp for Windows CR/LF on Linux machines
if(!$inQual){
if(/^(>|@)((.+?)( .*?\s*)?)$/){
my $newSeqID = $2;
my $newShortID = $3;
if($seqID){
printf("%d %s\n", length($seq), $seqID);
push(@lengths, length($seq));
}
...

我可以看到 IO::Uncompress::Gunzip通过以下方式支持透明解压缩:

If this option is set and the input file/buffer is not compressed data, the module will allow reading of it anyway.

In addition, if the input file/buffer does contain compressed data and there is non-compressed data immediately following it, setting this option will make this module treat the whole file/buffer as a single data stream.

我想基本上将透明解压缩插入 the diamond operator ,在加载每个文件和从文件输入中读取一行之间。有谁知道我该怎么做?

最佳答案

我经常使用:

die("Usage: prog.pl [file [...]]\n") if @ARGV == 0 && -t STDIN;
push(@ARGV, "-") unless @ARGV;
for my $fn (@ARGV) {
open(FH, $fn =~ /\.gz$/? "gzip -dc $fn |" : $fn =~ /\.bz2$/? "bzip2 -dc $fn |" : $fn) || die;
print while (<FH>);
close(FH);
}

此策略仅在您拥有 gzip 等并使用适当的文件扩展名命名文件时才有效,但一旦您满足这些要求,它就可以同时处理多种文件类型。关于-t STDIN,见explanation here .

关于fasta - 如何从 perl 中的标准输入和文件进行透明 gzip 解压缩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44781446/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com