Расширение массива внутри цикла for (список файлов) - PullRequest
0 голосов
/ 05 февраля 2019

У меня возникают проблемы при взаимодействии с файлами с помощью цикла for.Для простоты я создал небольшой цикл, который должен объяснить, какая проблема у меня возникла на данный момент.

Начальная точка: файлы в папке, которые имеют специфичные для файла однозначные номера вопределенная позиция в их имени файла.

Цель: Перебрать некоторые из этих файлов (не все), используя цикл for.

Проблема: Я создал массив, содержащий эти одно-трехзначные числа, специфичные для каждого файла.Файлы вызываются в начале цикла for, и я хотел бы использовать массив для ссылки на конкретные файлы.Но: Массив не расширяется правильно.

Надеюсь, кто-то может помочь!(Может быть несколько хороших альтернативных способов сделать это. Может быть, некоторые из них не нуждаются в массиве, но мне было бы интересно узнать решение моей конкретной проблемы, так как я думаю, что это может быть фундаментальное недоразумение в том, как расширить переменнуюкак часть имен файлов в начале цикла for.)

Это код:

declare -a SOME_SAMPLES=(37 132 253 642 242 42)

for d in prmrp_*_${SOME_SAMPLES[@]}_S*_L00?_R1_001.fastq.gz; do

    INPUT_FILE1=$(echo $d | sed 's/_L00._R1_001.fastq.gz//')
    echo ${INPUT_FILE1}

done

Опять же, это только пример кода.Проблема в том, что ${SOME_SAMPLES[@]} часть не расширяется правильно, поэтому цикл завершается неудачей.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

Попробуйте:

array=( 37 132 253 642 242 42 );

for d in ${array[@]}; do
    INPUT_FILE1="prmrp_*_"$d"_S*_L00?_R1_001.fastq.gz";
    echo ${INPUT_FILE1}
done
0 голосов
/ 05 февраля 2019

Думаю, проблема в том, что в

prmrp_*_${SOME_SAMPLES[@]}_S*_L00?_R1_001.fastq.gz

он не дублирует все выражение для каждого элемента массива, он просто вслепую вставляет элементы массива в середину, давая эквивалент этого:

prmrp_*_37 132 253 642 242 42_S*_L00?_R1_001.fastq.gz

... который представляет собой набор отдельных элементов (prmrp_*_37 в качестве подстановочного выражения, за которым следует 132 в виде простой строки, за которой следует 253 и т. Д.).AIUI вы хотите расширить содержимое массива, а затем для каждого элемента использовать выражение подстановочного знака, чтобы получить все соответствующие файлы.Лучший способ сделать это - использовать два цикла, один для расширения массива, а другой для поиска подходящих файлов:

for sample in "${SOME_SAMPLES[@]}"; do
    for d in prmrp_*_"${sample}"_S*_L00?_R1_001.fastq.gz; do
        ...

Кстати, я бы также рекомендовал использовать имена переменных в нижнем или смешанном регистре (например, sample выше), чтобы избежать возможных конфликтов со многими переменными всех заглавных букв со специальными значениями / функциями.Кроме того, я бы использовал расширение параметра для удаления суффикса имени файла (вместо sed):

input_file1=${d%_L00?_R1_001.fastq.gz}

Кроме того, вы обычно должны ставить двойные кавычки вокруг ссылок на переменные (например, echo "${input_file1}" вместоecho ${input_file1}).(Назначения, такие как input_file1=${d..., являются исключением, хотя двойные кавычки там не вредят; они просто не нужны.) Обратите внимание, что в приведенном выше цикле for я поместил двойные кавычки вокруг массива и ссылок на переменные,но не вокруг подстановочных знаков;это означает, что оболочка будет расширять символы подстановки (как вы хотите), но не связываться с содержимым переменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...