linux - 如何在单个函数中合并 zcat 和 bzcat

标签 linux bash gzip bzip2 fastq

我想构建一个可以处理 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
}

扩展提取工作不正常。你知道其他解决方案吗

最佳答案

这些是相当多的问题:

  • file=`echo $1 | ` 给出语法错误,因为 | 之后没有命令。但是无论如何您都不需要命令替换。只需使用 file=$1
  • ext=${file##*/> 不是提取扩展名,而是提取文件名。要提取扩展名,请使用 ext=${file##*.}
  • 在您的检查中,您没有使用变量 $ext,而是使用了文字字符串 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

关于linux - 如何在单个函数中合并 zcat 和 bzcat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68860387/

相关文章:

python数据库API编码

c++ - std::thread 创建抛出异常

bash - 遍历 Ubuntu 16 中的文件夹文件

linux - Crontab 作业调度不起作用

linux - 如何在 linux 上使用 sftp 上传包含其他文件夹的整个文件夹?

linux - 当您的 Debian Linux 服务器上已经有一个正在运行/工作/配置的 Nagios 实例时,是否可以部署 NConf?

linux - ISO-8859 中的倒置感叹号和问号

c# - 从 HTTPClient 响应中解压 GZip 流

python - 如何确定 Python 中 gzip 文件的内容长度?

http - 什么编码字符串告诉 Web 服务器不要发送 gzip 内容?