Ошибка: слишком много позиционных аргументов (1) при использовании BLAST с bash для цикла
Я пытаюсь написать сценарий, который будет проходить через все каталоги в каталоге, где он будет запрашивать определенную последовательность в локальной базе данных Blast. Я запустил поиск BLAST без цикла bash for и в первую очередь использовал цикл 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 ответа
Держу пари, у вас есть каталог с более чем одним совпадающим файлом BLAST. Попробуйте этот тест:
for d in ~/data/Shen_transcriptomes/transcriptomes/*/; do
echo "For directory $d have:"
ls -1 "$d"*BLASTdb*
echo
done
Хорошо, как я уже упоминал в редактировании моего вопроса выше. Кажется, я нашел решение:
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
Я не понимаю, почему это работает, но это работает. Возможно, это как-то связано со звездочкой в моей предыдущей попытке? Если кто-то может уточнить, пожалуйста, сделайте! Однако для моих собственных целей я считаю это решенным.
Спасибо всем за комментирование.