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