Неожиданное поведение переменных в цикле while

Ваш файл сценария:

#!/bin/bash
filemask=${1:-"key_*"}
file=/home/file
find. -maxdepth 1 -iname "$filemask" >> "$file"

  • переменная filemask задается из командной строки в качестве первого параметра вашего скрипта. Если он не указан или указан, но пуст, то скрипт сделает его ключевым _*.
  • Результаты команды findдобавляются в файл, имя которого хранится в переменной $file. OTW, каждый раз, когда вы запускали свой скрипт, содержимое предыдущего запуска перезаписывалось.
1
16.10.2019, 21:14
1 ответ

Основная проблема заключается в том, что вы запускаете 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, и я не тестировал финальный цикл.

4
27.01.2020, 23:17

Теги

Похожие вопросы