Expansão de parâmetro na variável atribuída com um curinga

8

Eu tenho dois arquivos na minha pasta atual (MA502) cujos nomes são -

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

Eu tenho muitas dessas pastas - ex MA503, MA504 etc, e quero fazer um loop sobre elas.

Atribuo meus nomes de variáveis ​​usando curingas -

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

Quero processar esses arquivos em um script e quero que minha saída seja substituída .atpor .atqt, para que o nome final seja semelhante a -

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

eu tentei

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

Meu nome de arquivo final se parece com -

*R1*.atqt.fastq

em vez da minha expectativa que era

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq

Eu aprendi tudo por necessidade no unix, então não tenho certeza de como os nomes das variáveis ​​são processados. Qualquer ajuda é apreciada!

Ayush Saxena
fonte

Respostas:

13

O comando Forward=*R1*.at.fastqdefine a variável Forwardpara a sequência *R1*.at.fastq(estrela, R maiúsculo, dígito 1, estrela, ponto, A minúsculo, etc.). Os curingas são expandidos apenas em contextos que permitem várias palavras; o tamanho do lado direito de uma atribuição de variável espera uma única palavra; portanto, não ocorre expansão de curinga.

Em um comando como cat $Forward, os curingas no valor de Forwardsão expandidos. Quando uma variável é expandida fora de aspas duplas, seu valor é interpretado como uma lista delimitada por espaço em branco de padrões curinga e, se algum padrão corresponde a um ou mais arquivos, é substituído pela lista de arquivos.

Em ${Forward/.at/.atqt}, primeiro o valor da variável é procurado: *R1*.at.fastq. Em seguida, a substituição de texto é aplicada a essa sequência, produzindo *R1*.atqt.fastq. O resultado é uma expansão de variável sem aspas, portanto é interpretada como um padrão curinga. Como *R1*.atqt.fastqnão corresponde a nenhum arquivo, ele permanece inalterado.

Para expandir o curinga ao definir Forward, você pode transformá-lo em uma matriz.

Forward=(*R1*.at.fastq)

Isso define Forwarduma matriz de 1 elemento, o elemento sendo a sequência MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq. O padrão curinga é expandido para a lista de correspondências porque está em um contexto (os parênteses da atribuição da matriz) em que várias palavras são esperadas.

No bash, $Forwardquando Forwardé uma matriz é equivalente a ${Forward[0]}- referenciar uma variável de matriz com a mesma sintaxe que uma variável escalar se refere ao primeiro elemento da matriz. Portanto, você pode deixar seu comando awk inalterado.

Gilles 'SO- parar de ser mau'
fonte
O script funcionou e sua explicação é muito fácil para mim. Muito obrigado!
Ayush Saxena