质控脚本来喽

好久不更新,上个硬货。脚本需提前准备宿主和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"
相关推荐
愚润求学17 分钟前
【Linux】POSIX信号量
linux·运维
进阶的DW29 分钟前
新手小白使用VMware创建虚拟机安装Linux
java·linux·运维
jz_ddk34 分钟前
[zynq] Zynq Linux 环境下 AXI BRAM 控制器驱动方法详解(代码示例)
linux·运维·c语言·网络·嵌入式硬件
深思慎考1 小时前
Linux网络——socket网络通信udp
linux·网络·udp
一介草民丶2 小时前
Jenkins | Linux环境部署Jenkins与部署java项目
java·linux·jenkins
字节高级特工2 小时前
【Linux篇】0基础之学习操作系统进程
linux·运维·服务器·数据结构·windows·学习·list
s_little_monster2 小时前
【Linux】网络--数据链路层--以太网
linux·运维·网络·经验分享·笔记·学习·计算机网络
belldeep5 小时前
WSL 安装 Debian 12 后,Linux 如何安装 curl , quickjs ?
linux·运维·debian·curl·quickjs
%#RulER#%7 小时前
哈工大计算机系统2024大作业——Hello的程序人生
linux·笔记·程序人生
y1x2y37 小时前
【HITCSAPP 哈工大计算机系统期末大作业】 程序人生-Hello’s P2P
linux·程序人生·ubuntu