Расширение параметра в переменной, назначенной с подстановочным знаком

8

У меня есть два файла в моей текущей папке (MA502), чьи имена -

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq
MA502_TAAGGCGA-TCGCAGG_L001_R2_001.at.fastq

У меня есть много таких папок - например, MA503, MA504 и т. Д., И я хочу зациклить их.

Я назначаю имена переменных с помощью подстановочных знаков -

Forward=*R1*.at.fastq
Reverse=*R2*.at.fastq

Я хочу , чтобы обработать эти файлы в сценарии, и я хочу , чтобы мой выход на замену , .atчтобы .atqt, таким образом , что окончательное название будет выглядеть -

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq
MA502_TAAGGCGA-TCGCAGG_L001_R2_001.atqt.fastq

Я старался

awk 'script' $Forward > ${Forward/.at/.atqt}

Мое окончательное имя файла выглядит как -

*R1*.atqt.fastq

вместо моего ожидания, которое было

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq

Я узнал все по необходимости на Unix, поэтому я не уверен, как обрабатываются имена переменных. Любая помощь приветствуется!

Аюш Саксена
источник

Ответы:

13

Команда Forward=*R1*.at.fastqустанавливает переменную Forwardв строку *R1*.at.fastq(звездочка, заглавная R, цифра 1, звездочка, точка, строчная буква A и т. Д.). Подстановочные знаки раскрываются только в тех контекстах, которые допускают несколько слов; правый размер присваивания переменной предполагает одно слово, поэтому расширение подстановочными знаками не происходит.

В такой команде cat $Forwardсимволы подстановки в значении Forwardраскрываются. Когда переменная раскрывается за пределы двойных кавычек, ее значение интерпретируется как список шаблонов, разделенных пробелами, и, если какой-либо шаблон соответствует одному или нескольким файлам, он заменяется списком файлов.

В ${Forward/.at/.atqt}, первое значение переменной ищется: *R1*.at.fastq. Затем к этой строке применяется подстановка текста, что дает *R1*.atqt.fastq. Результатом является расширение переменной без кавычек, поэтому оно интерпретируется как шаблон подстановочного знака. Но *R1*.atqt.fastqне соответствует ни одному файлу, поэтому он остается без изменений.

Чтобы расширить шаблон при настройке Forward, вы можете сделать его массивом.

Forward=(*R1*.at.fastq)

Это устанавливает Forward1-элементный массив, элемент которого является строкой MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq. Шаблон подстановочного знака расширен до списка совпадений, потому что он находится в контексте (круглые скобки назначения массива), где ожидается несколько слов.

В bash $Forwardкогда Forwardмассив является эквивалентом ${Forward[0]}- ссылка на переменную массива с тем же синтаксисом, что и у скалярной переменной, относится к первому элементу массива. Таким образом, вы можете оставить свою команду awk без изменений.

Жиль "ТАК - перестань быть злым"
источник
Сценарий сработал, и ваше объяснение мне очень легко дается. Большое спасибо!
Аюш Саксена