质控脚本来喽

好久不更新,上个硬货。脚本需提前准备宿主和rrna的bowtie2索引文件,原始数据的命名方式为{sample}_raw_1/2.fq.gz,保存有原始数据路径的文件,保存样品列表的文件。

最后打个广告,欢迎畜牧学方向的研究生报考兰州大学。

复制代码
#!/bin/bash
# 脚本功能:二代测序数据质控、去rRNA与去宿主序列处理
#版本1.2,新增了--rrna功能
usage() {
    echo "用法: $0 [--host <宿主类型>] [--rrna] <路径文件> <样品名列表文件>"
    exit 1
}

# ---------- 配置路径 ----------
declare -A HOST_INDEX=(
    [sheep]="/mnt/data/database/bowtie/sheep/sheepgenome"
    [goat]="/mnt/data/database/bowtie/goat/goatgenome"
    [cattle]="/mnt/data/database/bowtie/cattle/cattlegenome"
)
SSU_INDEX="/mnt/data/database/bowtie/SSU/SSU"
LSU_INDEX="/mnt/data/database/bowtie/LSU/LSU"

# 初始化变量
HOST=""
REMOVE_RRNA=false
INPUT_FILE=""
SAMPLE_LIST=""
# 增强参数解析
while [[ $# -gt 0 ]]; do
    case "$1" in
        --host)
            # 宿主类型验证
            if [[ ! " sheep goat cattle " =~ " $2 " ]]; then
                echo "错误:无效宿主类型 '$2',可选: sheep/goat/cattle"
                exit 1
            fi
            HOST="$2"
            shift 2 ;;
        --rrna)
            REMOVE_RRNA=true
            shift ;;
        --help)
            usage ;;
        -*)
            echo "错误:未知选项 $1"
            usage ;;
        *)
            # 位置参数处理
            if [[ -z $INPUT_FILE ]]; then
                INPUT_FILE="$1"
            elif [[ -z $SAMPLE_LIST ]]; then
                SAMPLE_LIST="$1"
            else
                echo "错误:多余参数 $1"
                usage
            fi
            shift ;;
    esac
done

# 验证必要参数
if [[ -z $INPUT_FILE || -z $SAMPLE_LIST ]]; then
    echo "错误:缺失必要参数!"
    usage
fi

# 读取原始路径并验证
INPUT_DIR=$(cat "$INPUT_FILE")
if [[ ! -d $INPUT_DIR ]]; then
    echo "错误:路径文件中的目录 $INPUT_DIR 不存在"
    exit 1
fi

# 宿主索引验证
if [[ -n $HOST ]]; then
    INDEX="${HOST_INDEX[$HOST]}"
    if [[ ! -f "${INDEX}.1.bt2" ]]; then
        echo "错误:宿主索引文件 ${INDEX}.1.bt2 不存在"
        exit 1
    fi
fi

# ---------- 目录创建 ----------
CLEAN_DIR=$(dirname "$INPUT_DIR")/cleandata
mkdir -p "$CLEAN_DIR" || { echo "错误:无法创建目录 $CLEAN_DIR"; exit 1; }



# ---------- 处理流程 ----------
process_sample() {
   local sample=$1
    local raw_1="${INPUT_DIR}/${sample}_raw_1.fq.gz"
    local raw_2="${INPUT_DIR}/${sample}_raw_2.fq.gz"
    local clip_1="${CLEAN_DIR}/${sample}.clip.1.fq.gz"
    local clip_2="${CLEAN_DIR}/${sample}.clip.2.fq.gz"
   
   # Step 1: 质控(fastp默认参数)
    echo "[$(date)] 处理样品 $sample:质控中..."
    fastp -i "$raw_1" -I "$raw_2" -o "$clip_1" -O "$clip_2" || {
        echo "错误:fastp处理失败!"
        exit 1
    }
   #Step 2: 去宿主
    if [[ -n $HOST ]]; then
        echo "[$(date)] 去除宿主 $HOST 序列..."
        bowtie2 -p 192 -x "$INDEX" --quiet\
            -1 "$clip_1" -2 "$clip_2" \
            --un-conc-gz "${CLEAN_DIR}/${sample}.clean.fq.gz" \
			--al-conc-gz "${CLEAN_DIR}/${sample}.host.fq.gz" \
            -S /dev/null > "${CLEAN_DIR}/${sample}.bowtie2.log" || exit 1
        mv "${CLEAN_DIR}/${sample}.clean.fq.1.gz" "$clip_1"
        mv "${CLEAN_DIR}/${sample}.clean.fq.2.gz" "$clip_2"
    fi
    
  #Step 3: 去rRNA
    if $REMOVE_RRNA; then
        echo "[$(date)] 去除rRNA序列(SSU+LSU)..."

        # SSU过滤
        bowtie2 -p 192 -x "$SSU_INDEX" --quiet\
            -1 "$clip_1" -2 "$clip_2" \
            --un-conc-gz "${CLEAN_DIR}/${sample}.clean.fq.gz" \
			--al-conc-gz "${CLEAN_DIR}/${sample}.SSU.fq.gz" \
            -S /dev/null > "${CLEAN_DIR}/${sample}.SSU.log" || exit 1
        mv "${CLEAN_DIR}/${sample}.clean.fq.1.gz" "$clip_1"
        mv "${CLEAN_DIR}/${sample}.clean.fq.2.gz" "$clip_2"
		
        # LSU过滤
        bowtie2 -p 192 -x "$LSU_INDEX" --quiet\
             -1 "$clip_1" -2 "$clip_2" \
            --un-conc-gz "${CLEAN_DIR}/${sample}.clean.fq.gz" \
			--al-conc-gz "${CLEAN_DIR}/${sample}.LSU.fq.gz" \
            -S /dev/null > "${CLEAN_DIR}/${sample}.LSU.log" || exit 1
        mv "${CLEAN_DIR}/${sample}.clean.fq.1.gz" "$clip_1"
        mv "${CLEAN_DIR}/${sample}.clean.fq.2.gz" "$clip_2"
       
    fi

   
}
 # 遍历样品列表
while IFS= read -r sample; do
    [[ -z $sample ]] && continue  # 跳过空行
    process_sample "$sample"
done < "$SAMPLE_LIST"

mkdir ${CLEAN_DIR}/host ${CLEAN_DIR}/rRNA ${CLEAN_DIR}/log
mv ${CLEAN_DIR}/*host\.fq* ${CLEAN_DIR}/host/
mv ${CLEAN_DIR}/*SU\.fq* ${CLEAN_DIR}/rRNA/
mv ${CLEAN_DIR}/*log ${CLEAN_DIR}/log
echo "[$(date)] 处理完成!结果保存至:$CLEAN_DIR"
相关推荐
深海蜗牛2 分钟前
Jenkins linux安装
linux·jenkins
愚戏师14 分钟前
Linux复习笔记(三) 网络服务配置(web)
linux·运维·笔记
JANYI201836 分钟前
嵌入式MCU和Linux开发哪个好?
linux·单片机·嵌入式硬件
请你喝好果汁64141 分钟前
TWASandGWAS中GBS filtering and GWAS(1)
信息可视化·数据挖掘·数据分析
熊大如如1 小时前
Java NIO 文件处理接口
java·linux·nio
晚秋大魔王1 小时前
OpenHarmony 开源鸿蒙南向开发——linux下使用make交叉编译第三方库——nettle库
linux·开源·harmonyos
农民小飞侠1 小时前
ubuntu 24.04 error: cannot uninstall blinker 1.7.0, record file not found. hint
linux·运维·ubuntu
某不知名網友1 小时前
Linux 软硬连接详解
linux·运维·服务器
hnlucky1 小时前
通俗易懂版知识点:Keepalived + LVS + Web + NFS 高可用集群到底是干什么的?
linux·前端·学习·github·web·可用性测试·lvs
Jogging-Snail1 小时前
Linux工作台文件操作命令全流程解析(高级篇之vim和nano精讲)
linux·运维·vim·文件操作·文本编辑·nano