Paired_end_Files_Grouping_Script.sh

#!/bin/bash

# 源目录,从命令行参数获取
SOURCE_DIR=$1
# 目标目录,从命令行参数获取
TARGET_DIR=$2

# 检查是否提供了两个参数
if [ $# -ne 2 ]; then
    echo "用法: $0 <源目录> <目标目录>"
    exit 1
fi

# 查找所有匹配第一读取文件模式的文件(*.un.1.fq.gz)
FILE_LIST=$(ls "$SOURCE_DIR"/*.un.1.fq.gz 2>/dev/null)

# 创建一个临时数组存储所有唯一的样本ID
SAMPLE_IDS=()
for FILE in $FILE_LIST; do
    # 从文件名中提取样本ID(移除.un.1.fq.gz后缀)
    SAMPLE_ID=$(basename "$FILE" .un.1.fq.gz)
    SAMPLE_IDS+=("$SAMPLE_ID")
done

# 计算样本对的总数
TOTAL_SAMPLES=${#SAMPLE_IDS[@]}
echo "找到的样本对总数: $TOTAL_SAMPLES"

# 计算需要的组数
NUM_GROUPS=$(( (TOTAL_SAMPLES + 99) / 100 ))
echo "将创建 $NUM_GROUPS 个组,每个组最多包含100个样本对"

# 如果组目录不存在,则创建它们
for ((i=1; i<=NUM_GROUPS; i++)); do
    GROUP_DIR="$TARGET_DIR/group$i"
    mkdir -p "$GROUP_DIR"
    echo "已创建目录: $GROUP_DIR"
done

# 将样本分配到各组中
COUNT=0
GROUP=1

for SAMPLE_ID in "${SAMPLE_IDS[@]}"; do
    # 检查两个配对文件是否都存在
    FILE1="$SOURCE_DIR/${SAMPLE_ID}.un.1.fq.gz"
    FILE2="$SOURCE_DIR/${SAMPLE_ID}.un.2.fq.gz"
    
    if [ -f "$FILE1" ] && [ -f "$FILE2" ]; then
        # 为un.1和un.2文件创建符号链接
        ln -sf "$(realpath "$FILE1")" "$TARGET_DIR/group$GROUP/${SAMPLE_ID}.un.1.fq.gz"
        ln -sf "$(realpath "$FILE2")" "$TARGET_DIR/group$GROUP/${SAMPLE_ID}.un.2.fq.gz"
        echo "已将 ${SAMPLE_ID} 链接到 group$GROUP"
        
        # 增加计数器并检查是否需要移至下一组
        COUNT=$((COUNT + 1))
        if [ $COUNT -eq 100 ]; then
            GROUP=$((GROUP + 1))
            COUNT=0
        fi
    else
        echo "警告: 无法找到 $SAMPLE_ID 的两个配对文件"
    fi
done

echo "已完成在 $NUM_GROUPS 个组中创建符号链接"

posted on 2025-03-31 21:12  Hahntoh  阅读(28)  评论(0)    收藏  举报

导航