linux - 如何在一个函数中合并 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
}
扩展提取无法正常工作。您是否知道其他解决方案
解决方案
这些是相当多的问题:
file=`echo $1 | `
给出语法错误,因为 . 之后没有命令|
。但是无论如何您都不需要命令替换。只需使用file=$1
.ext=${file##*/}
不是提取扩展名,而是提取文件名。要提取扩展名,请使用ext=${file##*.}
.- 在您的检查中,您没有使用变量
$ext
,而是使用文字 stringext
。 - 通常,只有文件名中最后一个点之后的字符串才被认为是扩展名。如果有
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
。
推荐阅读
- javascript - 反应输入颜色选择器
- c++ - 生成 TensorFlow 示例项目
- c# - 将 Oculus Unity 集成升级到 v12 后 Teleport 无法在 Quest 上运行
- html - 如何使用 VBA 在 Internet Exlorer 中单击 SPAN 元素
- excel - 如何在excel中反映数据?
- connection-pooling - Loopback Connector MongoDB - 连接池
- swift - 将 jpegData 分配给二进制核心数据
- c++ - 右值参数真的是函数范围内的左值参数吗?
- react-native - React Native - 带有换行符和键盘关闭键按钮的多行文本输入
- python - 当使用 sckit-image 分割并使用退出代码 139 完成进程(被信号 11:SIGSEGV 中断)时,我该如何解决它