#!/bin/bash
#######################################
# 脚本名称: merge_vcf.sh
# 作者: zheng
# 版本: 1.0
# 日期: 2024-01-24
# 描述: 合并指定目录及子目录中的所有VCF文件(文件名后缀为.vcf或.vcf.gz)为merged_file.vcf文件。
#######################################
# 显示帮助信息
function show_help() {
echo ""
echo "用法: ./merge_vcf.sh [选项]"
echo "选项:"
echo " -h, --help 显示帮助信息"
echo " -v, --version 显示脚本版本"
echo " -d, --dir file_fold 指定要处理的目录"
echo "指定目录及子目录下的文件必需全部以.vcf结尾或全部以.vcf.gz结尾"
echo "示例:"
echo " ./merge_vcf.sh -d ./data"
echo ""
}
# 显示版本信息
function show_version() {
echo "merge_vcf.sh 版本 1.0"
}
# 判断参数个数
if [ "$#" -eq 0 ]; then
show_help
exit 0
fi
# 处理命令行参数
while [[ $# -gt 0 ]]; do
case "$1" in
-h|--help)
show_help
exit 0
;;
-v|--version)
show_version
exit 0
;;
-d|--dir)
if [ -d "$2" ]; then
root_folder="$2"
echo "将合并 $root_folder 下的文件..."
else
echo "错误: 文件路径不存在。"
exit 1
fi
shift 2
;;
*)
echo "错误: 未知选项 $1"
exit 1
;;
esac
done
### 主要脚本逻辑
output_file="$root_folder/merged_file.vcf"
echo "合并后的文件名:"
echo "$output_file"
## 先检查文件是否存在,防止多次合并
if [ -e "$output_file" ]; then
# 文件存在,删除
rm "$output_file"
fi
## 使用 find 命令列出所有以 .vcf 或 .vcf.gz 结尾的文件,并将结果赋值给变量 files
files=$(find "$root_folder" -type f \( -name "*.vcf" -o -name "*.vcf.gz" \))
# 打印文件名
echo "目标目录下找到的文件:"
echo "$files"
# 初始化变量,用于标记是否使用 zcat
use_zcat=false
# 遍历文件列表
for file in $files; do
# 检查文件后缀
if [[ $file == *.gz ]]; then
use_zcat=true
break
fi
done
# 提取第一个文件以 "##" 开头的行到临时头文件
# 去除"##"行后合并文件,再加入头文件
first_file=$(echo "$files" | head -n 1)
if [[ $use_zcat == true ]]; then
zcat $first_file |grep "^##" > temp_header.vcf
for file in $files; do
zcat $file |grep '!/^##/' >> "$output_file"
done
else
grep "^##" "$first_file" > temp_header.vcf
for file in $files; do
awk '!/^##/' "$file" >> "$output_file"
done
fi
# 在输出文件开头插入临时头文件内容
cat temp_header.vcf "$output_file" > temp_output.vcf
mv temp_output.vcf "$output_file"
# 删除临时头文件
rm temp_header.vcf
echo "文件已成功合并到 $output_file"
echo "脚本执行完成"
合并指定目录下所有VCF文件的bash脚本
最新推荐文章于 2024-03-13 23:52:52 发布