如何用Bash批量为SPADES目录下的contigs.fasta追加对应目录名
原脚本错误点梳理
- 匹配逻辑错误:
for file in *EC18只能匹配名称以EC18结尾的文件/目录,无法覆盖所有EC开头的目标目录,也没有过滤出目录类型的对象 - 变量语法错误:
sample=${file/.fasta} perl -ane中变量赋值和perl命令未做分隔,且你遍历的是目录而非fasta文件,直接截取.fasta后缀完全不符合当前场景 - 路径逻辑错误:没有指定对应目录下的contigs.fasta路径,直接调用
${sample}.fasta根本找不到目标文件
可用实现脚本
仅需要重命名文件,无需修改序列内容
# 先cd到所有SPADES输出目录的父目录再运行 for dir in EC*-*; do # 仅处理存在contigs.fasta的目录,避免报错 if [ -d "$dir" ] && [ -f "$dir/contigs.fasta" ]; then # 直接在原目录下重命名 mv "$dir/contigs.fasta" "$dir/${dir}-contigs.fasta" # 如果需要把所有重命名后的文件统一放到指定目录,把上面的mv替换成下面的cp即可 # cp "$dir/contigs.fasta" "/pathway/where/files/are/SPADEs/${dir}-contigs.fasta" fi done
需要同时修改fasta序列头为递增NODE编号(匹配你原脚本的perl逻辑)
for dir in EC*-*; do if [ -d "$dir" ] && [ -f "$dir/contigs.fasta" ]; then sample="$dir" perl -ane 'if(/>/){$a++;print ">NODE_$a\n"}else{print}' "$dir/contigs.fasta" > "/pathway/where/files/are/SPADEs/${sample}-contigs.fasta" fi done
注意事项
运行脚本前可以先把mv/perl执行行替换成echo打印执行逻辑,确认目录匹配、输出路径都符合预期后再正式运行,避免误操作。
内容的提问来源于stack exchange,提问作者Gab
相关产品推荐
相关产品推荐

