Основная проблема заключается в том, что вы запускаете sed
без каких-либо входных данных, что означает, что он будет считывать свой стандартный входной поток, унаследованный от охватывающего цикла, который содержит имена файлов, которые вы передаете изls
(все в первой итерации цикла ). Дополнительная проблема заключается в том, что вы используете ls
для вывода списка ваших файлов (проще и безопаснее просто перебирать имена файлов, чем правильно читать выводls
). Кроме того, код немного сложно читать, учитывая несколько запутанное регулярное выражение, которое вы используете.
Для циклического просмотра файлов используйте
for pathname in mgp*/mgm*.3/*.fna; do
#... use "$pathname" here...
done
Чтобы получить трехзначный код генома из имени подкаталога, учитывая путь к файлу fasta в$pathname
:
genome=${pathname%.3/*.fna} # trim off tail
genome=${genome#mgp*/mgm????} # trim off head
Это даст вам, например. 322
в $genome
из mgp83581/mgm4729322.3/blah.fna
в $pathname
.
Таким же образом, чтобы получить номер проекта:
project=${pathname%/mgm*.3/*.fna} # trim off tail
project=${project#mgp} # trim off head
Теперь $project
будет 83581
, а $genome
будет 322
.
Чтобы вставить их после каждого >
в начале строки в каждом файле fasta:
for pathname in mgp*/mgm*.3/*.fna; do
genome=${pathname%.3/*.fna} # trim off tail
genome=${genome#mgp*/mgm????} # trim off head
project=${pathname%/mgm*.3/*.fna} # trim off tail
project=${project#mgp} # trim off head
sed -i.old "s/^>/>${project}_${genome}_/" "$pathname"
done
Это дополнительно создаст резервную копию старых файлов с суффиксом .old
.
Примечание. :Проверьте это на копии ваших собственных данных. У меня нет доступных файлов fasta, и я не тестировал финальный цикл.
Решил сам. Все, что мне нужно было сделать, это поставить
#!/bin/bash
в качестве первой строки скрипта.
(Чем старше я становился, тем лучше я был ).