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 个组中创建符号链接"
本文来自博客园,作者:Hahntoh,转载请注明原文链接:https://www.cnblogs.com/hahn/p/18802986
浙公网安备 33010602011771号