合并指定目录下所有VCF文件的bash脚本

#!/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 "脚本执行完成"

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值