首页 > 解决方案 > 如何在一个函数中合并 zcat 和 bzcat

问题描述

我想构建一个可以处理 fastq.gz 和 fastq.bz2 文件的小辅助函数。

我想将 zcat 和 bzcat 合并为一个可用于两种文件的透明函数:

zbzcat example.fastq.gz
zbzcat example.fastq.bz2


zbzcat() {
  file=`echo $1 | `
## Not working
  ext=${file##*/};
  
  if [ ext == "fastq.gz" ]; then
    exec gzip -cd "$@"  
  else
    exec bzip -cd "$@"  
  fi
}

扩展提取无法正常工作。您是否知道其他解决方案

标签: linuxbashgzipbzip2fastq

解决方案


这些是相当多的问题:

  • file=`echo $1 | ` 给出语法错误,因为 . 之后没有命令|。但是无论如何您都不需要命令替换。只需使用file=$1.
  • ext=${file##*/}不是提取扩展名,而是提取文件名。要提取扩展名,请使用ext=${file##*.}.
  • 在您的检查中,您没有使用变量$ext,而是使用文字 string ext
  • 通常,只有文件名中最后一个点之后的字符串才被认为是扩展名。如果有file.fastq.gz,则扩展名为gz. 所以使用检查$ext = gz。无论如何,未压缩的文件是fastq文件与功能无关。
  • exec用给定的命令替换 shell 进程。所以在执行你的函数后,shell 会退出。只需执行命令。

顺便说一句:使用模式匹配时,您根本不必提取扩展名:

zbzcat() {
  file="$1"
  case "$file" in
    *.gz) gzip -cd "$@";;
    *.bz2) bzip -cd "$@";;
    *) echo "Unknown file format" >&2;;
  esac
}

或者,使用7z x它支持很多格式。大多数发行版都将包命名为p7zip


推荐阅读