如何用循环与条件语句批量运行EagleC的predictSV命令?
解决.mcool文件批量运行EagleC predictSV的问题
正确批量处理脚本
以下是可以直接使用的bash脚本,包含完整的逻辑判断与命令执行:
#!/bin/bash # 遍历当前目录下所有.mcool文件(如需递归子目录,见下方补充) for mcool_file in *.mcool; do # 提取.mcool扩展名前的字符串作为id id="${mcool_file%.mcool}" # 提取id最后一个/后的子串(兼容带路径的文件名) last_part="${id##*/}" # 判断是否为目标分辨率数值 if [[ "$last_part" =~ ^(5000|10000|50000)$ ]]; then # 替换为你的实际EagleC predictSV单文件命令模板 EagleC predictSV --input "$mcool_file" --output "${id}_sv_pred_result.txt" # 可选:打印执行日志,方便调试跟踪 echo "已完成处理: $mcool_file" fi done
关键逻辑说明
- 文件遍历:
for mcool_file in *.mcool精准遍历当前目录下的.mcool文件,避免混入其他无关命令输出。 - ID提取:用bash参数扩展
${mcool_file%.mcool}安全去掉文件后缀,不会受路径空格或特殊字符影响。 - 分辨率判断:
${id##*/}提取路径最后一段内容,再通过正则匹配严格判断是否为5000/10000/50000,避免误匹配类似500000的数值。 - 命令执行:所有变量用双引号包裹,防止路径含空格时命令解析错误。
针对你之前问题的排查点
你提到测试循环时输出包含cooler、ls及文件路径,说明之前的循环写法存在以下问题:
- 错误将
ls *.mcool与其他命令的输出混合作为循环输入,比如写成for file in $(ls *.mcool | cooler ...),导致变量被分割成无效片段。 - 未正确处理带路径的文件名,导致分辨率判断逻辑失效,进而没有触发EagleC命令。
- 变量未加双引号,路径含空格时命令直接执行失败且无输出。
递归遍历子目录的补充脚本
如果需要处理子目录下的.mcool文件,改用find命令实现递归遍历:
find . -name "*.mcool" -type f | while read -r mcool_file; do id="${mcool_file%.mcool}" last_part="${id##*/}" if [[ "$last_part" =~ ^(5000|10000|50000)$ ]]; then EagleC predictSV --input "$mcool_file" --output "${id}_sv_pred_result.txt" echo "已完成处理: $mcool_file" fi done
调试建议
- 在循环内添加
echo "当前文件: $mcool_file,ID: $id,分辨率片段: $last_part",确认变量值是否符合预期。 - 先手动执行单个文件的EagleC命令,确认命令本身能正常输出结果,排除命令自身问题。
- 给脚本添加执行权限:
chmod +x batch_eaglec.sh,再通过./batch_eaglec.sh运行。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

