我正在尝试编写一个脚本,该脚本将遍历目录中的所有目录,并在其中针对本地blast数据库查询特定序列。我已经在没有bash for循环的情况下运行了BLAST搜索,并且首先使用了for循环来创建数据库。我已经尝试了其他所有由这个问题(如果适用)建议的人,但无济于事。我没有复制和粘贴任何内容,我重新输入了脚本并查找了愚蠢的错误(我已经做了很多)。也许我只是没有看到它?无论如何,这是代码:
SRV01:~$ for d in ~/data/Shen_transcriptomes/transcriptomes/*/; do tblastn -query ~/data/chitin_binding_protein/cbp_Tectaria_macrodonta.fa -db "$d"*BLASTdb* -out "$(basename "$d")".out; done
当我使用echo "$d"*BLASTdb*
运行相同的命令时,它将返回正确的文件。所以for循环似乎可以正常工作,但是上面的脚本返回了:
Error: Too many positional arguments (1), the offending value: /home/dwickell/data/Shen_transcriptomes/transcriptomes/Acrostichum_aureum_RS90/RS_90_BLASTdb.nin
目录中的每个BLASTdb文件。
-编辑-
这可行,但是我对bash的了解不足以了解原因:
SRV01:~/data$ for d in /home/dwickell/data/Shen_transcriptome/transcriptomes/*/*.nin; do
name=$(echo "$d" | cut -f 1 -d '.')
blastn -query ./chitin_binding_protein/cbp_Tectaria_macrodonta.fa -db "$name" -outfmt 6 -out RS_103_tblastn.out; done
答案 0 :(得分:1)
我敢打赌,您的目录中包含多个匹配的BLAST文件。试试这个测试:
for d in ~/data/Shen_transcriptomes/transcriptomes/*/; do
echo "For directory $d have:"
ls -1 "$d"*BLASTdb*
echo
done
答案 1 :(得分:1)
好的,正如我在上述问题的编辑中提到的那样。我似乎找到了解决方法:
for d in /home/dwickell/data/Shen_transcriptomes/transcriptomes/*/*.nin; do
name=$(echo "$d" | cut -f 1 -d '.')
blastn -query ./chitin_binding_protein/cbp_Tectaria_macrodonta.fa -db "$name" -outfmt 6 -out "$(basename "$d" .nin)".out; done
我不清楚为什么会这样,但是可以。也许与我先前尝试中的星号有关?如果有人可以澄清,请执行!但是出于我自己的目的,我认为这已解决。
感谢大家发表评论。