fasta – 如何从stdin和perl中的文件中解压缩透明gzip?

我已经编写了一些用于处理FASTA / FASTQ文件的脚本(例如 fastx-length.pl),但是希望使它们更通用,并接受压缩和未压缩文件作为命令行参数和标准输入(以便脚本“只是工作“当你向他们扔掉随机文件时”.对我来说,在未压缩和压缩文件(例如压缩读取文件,未压缩的组合基因组)上工作是很常见的,并且像<(zcat file.fastq.gz)之类的插槽很快就会烦人. 这是fastx-length.pl脚本中的一个示例块:

...
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.

相关文章

忍不住在 PerlChina 邮件列表中盘点了一下 Perl 里的 Web 应用框架(巧的是 PerlBuzz 最近也有一篇相关...
bless有两个参数:对象的引用、类的名称。 类的名称是一个字符串,代表了类的类型信息,这是理解bless的...
gb2312转Utf的方法: use Encode; my $str = "中文"; $str_cnsoftware = encode("utf-8...
  perl 计算硬盘利用率, 以%来查看硬盘资源是否存在IO消耗cpu资源情况; 部份代码参考了iostat源码;...
1 简单变量 Perl 的 Hello World 是怎么写的呢?请看下面的程序: #!/usr/bin/perl print "Hello W...
本文介绍Perl的Perl的简单语法,包括基本输入输出、分支循环控制结构、函数、常用系统调用和文件操作,...