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

7

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 eu quero passar por cima delas.

Eu atribuo os nomes das minhas variáveis usando curingas -

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

Eu quero processar esses arquivos em um script e quero que minha saída substitua .at a .atqt , de modo que o nome final se pareça com -

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 final do arquivo se parece com -

*R1*.atqt.fastq

em vez da minha expectativa, que foi

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!

    
por Ayush Saxena 03.07.2015 / 22:58

1 resposta

10

O comando Forward=*R1*.at.fastq define a variável Forward como a string *R1*.at.fastq (estrela, maiúscula R, dígito 1, estrela, ponto, minúscula A, etc.). Os caracteres curinga são expandidos apenas em contextos que permitem várias palavras; o tamanho da mão direita de uma atribuição de variável espera uma única palavra, portanto não ocorre nenhuma expansão de caractere curinga.

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

Em ${Forward/.at/.atqt} , primeiro o valor da variável é pesquisado: *R1*.at.fastq . Em seguida, a substituição de texto é aplicada a essa string, gerando *R1*.atqt.fastq . O resultado é uma expansão de variável sem aspas, portanto, ela é interpretada como um padrão de caractere curinga. Mas *R1*.atqt.fastq não corresponde a nenhum arquivo, portanto, não foi alterado.

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

Forward=(*R1*.at.fastq)

Isso define Forward como uma matriz de 1 elemento, sendo o elemento a string 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 de matriz), onde várias palavras são esperadas.

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

    
por 04.07.2015 / 01:57