错误:使用BLAST和bash进行循环时,位置参数过多(1)

时间:2018-09-12 19:14:07

标签: bash bioinformatics blast ncbi

我正在尝试编写一个脚本,该脚本将遍历目录中的所有目录,并在其中针对本地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

2 个答案:

答案 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

我不清楚为什么会这样,但是可以。也许与我先前尝试中的星号有关?如果有人可以澄清,请执行!但是出于我自己的目的,我认为这已解决。

感谢大家发表评论。