By liyupeng, 14 April, 2026
Forums

全自动重复序列注释脚本:repeat_anno.sh

示例命令

  1. 命令参数
    1. i,指定输入基因组文件
    2. t,指定使用的线程数量
    3. d,指定额外的重复序列库(来自公共数据库或者近缘物种的重复序列注释)
nohup bash repeat_anno.sh -i test.fasta -t 40 -d other_repeat.fasta &    

README

README: Script and Docker Image Usage for Repeat Annotation
All software for repeat annotation was installed using Miniconda or cloned from GitHub and installed in /home/soft/.

Usage:

bash repeat_anno.sh -i test.fasta -t 40

Options:

-i: Specify the genome sequence file in FASTA format.
-t: Indicate the number of CPU/threads for parallel processing.
-d: Specify an additional library containing repeat sequences used for masking. (Optional)

Output:
The following files will be generated in the results/ directory:

ltr_repeat: Predicted LTR (Long Terminal Repeat) candidates identified by LTRharvest and LTR_FINDER_parallel.
repeatmodeler: Predicted repeat sequences identified by RepeatModeler.
results:
Repeat annotation in GFF3 format (describes repeat locations).
Soft-masked genome sequence (genome with repeats in lowercase letters).
Hard-masked genome sequence (genome with repeats replaced by 'N').
Statistics Table for Repetitive Elements (table summarizing the types and counts of repeats).

Notes:

Ensure the input FASTA file is formatted correctly.
The -t option allows parallel processing to speed up repeat annotation.
The -d option is optional and can enhance repeat masking by using an additional repeat library.

输出文件

使用脚本后,会把基因组序列文件名作为前缀,生成一个后缀是“_dir”的文件夹,下方是这三个

  1. ltr_repeat:LTR逆转座子的预测结果(scn)、注释、库文件(fasta)
  2. repeatmodeler:该工具预测的重复序列,分类后的各种重复序列(fasta格式)
  3. results:软屏蔽和硬屏蔽后的基因组序列,重复序列注释文件,统计表信息

源代码

#!/bin/bash

# 初始化变量
input=""
threads=""
repeat_lib=""

# 使用 getopts 来处理 -i, -t 和 -d 参数,将参数后面的值赋给变量
while getopts "i:t:d:" opt; do
    case $opt in
        i)  # 处理 -i 参数
            input=$OPTARG  # 将 -i 参数后面的值存储在变量 input 中
            ;;
        t)  # 处理 -t 参数
            threads=$OPTARG  # 将 -t 参数后面的值存储在变量 threads 中
            ;;
        d)  # 处理 -d 参数
            repeat_lib=$OPTARG  # 将 -d 参数后面的值存储在变量 repeat_lib 中
            ;;
        \?)  # 处理无效参数
            echo "无效参数:-$OPTARG"
            exit 1
            ;;
    esac
done

mkdir -p "${input}_dir"

# 原本打算在cp的时候顺便改个名,结果无法执行,这一部分只能拆开来分成两步走
cp "$input" target.fasta
mv target.fasta "${input}_dir"
cd "${input}_dir"

# 参考文章:https://www.jianshu.com/p/f7c0115e1d89
# 第一部分,LTRs鉴定
# 创建ltr_repeat文件夹,ltrs的鉴定放在该文件夹下方
mkdir ltr_repeat
cd ltr_repeat

# ltr_finder_parallel鉴定ltrs,输出文件:target.fasta.finder.combine.scn
# 参数设定依据:https://github.com/oushujun/LTR_FINDER_parallel?tab=readme-ov-file
/home/soft/LTR_FINDER_parallel/LTR_FINDER_parallel -seq ../target.fasta -threads $threads -w 2 -C -D 15000 -d 1000 -L 7000 -l 100 -p 20 -M 0.85 -harvest_out &

# ltrharvest建立索引
gt suffixerator -db ../target.fasta -indexname target -tis -suf -lcp -des -ssp -sds -dna

# ltrharvest鉴定ltrs,输出文件:target.harvest.scn
gt ltrharvest -index target -similar 85 -vic 10 -seed 20 -seqids yes -minlenltr 100 -maxlenltr 7000 -mintsd 4 -maxtsd 6 -motif TGCA -motifmis 1 > target.harvest.scn &

# 在两个ltr后面加上&,后台运行,wait等待两个ltr完成运行后再继续运行后面的命令
wait

# 合并ltrharvest和ltr_finder_parallel鉴定出来的两个库文件
cat target.fasta.finder.combine.scn target.harvest.scn > all.scn

# 用ltr_retriever对两个库文件进行合并,然后屏蔽,得到ltrs的库文件和第一次屏蔽后的重复序列
/home/soft/LTR_retriever/LTR_retriever -genome target.fasta -inharvest all.scn -threads $threads

# 对库文件进行重命名
mv *.LTRlib.fa LTR.lib
chmod 777 LTR.lib
cp LTR.lib ..

# 将经过屏蔽的基因组文件中的重复序列(N)删除掉
tr -d 'nN' < target.fasta.masked | seqkit seq > target.rmmasked.fasta
cp target.rmmasked.fasta ..

# 高量化部分重要中间文件,便于后续检查
chmod 777 target.harvest.scn target.fasta.finder.combine.scn all.scn target.fasta.masked target.rmmasked.fasta

# 回到上一级目录,在基因组_repeat文件夹下方
cd ../

# 第二部分,repeatmodeler鉴定重复序列
# 创建文件夹,进入文件夹
mkdir repeatmodeler
mv target.rmmasked.fasta repeatmodeler
cd repeatmodeler

# 如果输入了重复序列库(-d),则使用该库
if [ -n "$repeat_lib" ]; then
    echo "使用提供的重复序列库: $repeat_lib"
    # 可以根据需求在这里添加使用该重复序列库的代码(如添加额外步骤)
    cp "$repeat_lib" repeat_lib
fi

# 建立索引
BuildDatabase -engine ncbi -name target target.rmmasked.fasta

# 运行repeatmodeler
RepeatModeler -threads $threads -engine ncbi -database target

# 进入repeatmodeler的输出文件夹中,RM开头的
cd RM*

# 按照标识符是否为unknown进行分类,分为已知和未知的文件
seqkit grep -nrp 'Unknown' consensi.fa.classified > repeatmodeler_unknowns.fasta
seqkit grep -vnrp 'Unknown' consensi.fa.classified > repeatmodeler_identities.fasta

# 转座酶数据库建立索引
makeblastdb -in /home/data/Tpases020812 -dbtype prot -out Tpases020812

# 和转座酶数据库进行比对,如果能够比对的上,就归类到已知的
blastx -query repeatmodeler_unknowns.fasta -db Tpases020812 -evalue 1e-10 -num_descriptions 10 -num_threads $threads -out modelerunknown_blast_results.txt

# 解析比对结果,提取已知的转座子(重复序列的一种类型)
perl /home/soft/CRL_Scripts1.0/transposon_blast_parse.pl --blastx modelerunknown_blast_results.txt --modelerunknown repeatmodeler_unknowns.fasta

# 文件重命名,顺便高亮,还有复制移动
cp unknown_elements.txt ModelerUnknown.lib
cat identified_elements.txt repeatmodeler_identities.fasta > ModelerID.lib
chmod 777 ModelerUnknown.lib ModelerID.lib
cp ModelerUnknown.lib ModelerID.lib ../../
cd ../../

#第三部分,屏蔽重复序列(这里融合了同源找到的重复序列鉴定的一步,不过不是很重要了)
#合并文件
#KnownRepeats.lib,已知分类的重复序列库
#allrepeats.lib是全部的重复序列库,包括unclassfied的部分
#因为我们的主要目的是预测蛋白编码基因,所以这里把鉴定到的重复序列全部屏蔽了


# 判断 $repeat_lib 是否为空,如果为空就不包含它
if [ -n "$repeat_lib" ]; then
    cat LTR.lib ModelerID.lib "$repeat_lib" > KnownRepeats.lib
else
    cat LTR.lib ModelerID.lib > KnownRepeats.lib
fi

cat KnownRepeats.lib ModelerUnknown.lib > allRepeats.lib 

#开始对基因组上的重复序列进行硬屏蔽和软屏蔽
mkdir repeatmasker
cd repeatmasker/

#硬屏蔽
mkdir hard
cd hard/
# 计算线程数,每个进程分配的线程数,向下取整
RepeatMasker -e ncbi -pa $((threads / 4)) -gff -lib ../../allRepeats.lib ../../target.fasta -dir ./
cd ..

#软屏蔽
mkdir soft
cd soft/
RepeatMasker -xsmall -e ncbi -pa $((threads / 4)) -gff -lib ../../allRepeats.lib ../../target.fasta -dir ./

#结果文件处理
mv target.fasta.masked $input.soft.masked.fasta 

cd ..
mv hard/target.fasta.masked hard/$input.hard.masked.fasta 
mv hard/target.fasta.tbl hard/$input.repeat.tbl
mv hard/target.fasta.out.gff hard/$input.repeat.gff

cd ..
mkdir results
mv repeatmasker/soft/$input.soft.masked.fasta results/
mv repeatmasker/hard/$input.hard.masked.fasta results/
mv repeatmasker/hard/$input.repeat.tbl results/
mv repeatmasker/hard/$input.repeat.gff results/

rm target.fasta *.lib 
rm repeatmodeler/target.rmmasked.fasta
rm -rf repeatmasker/