Expansion des paramètres dans une variable affectée d'un caractère générique

8

J'ai deux fichiers dans mon dossier actuel (MA502) dont les noms sont -

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

J'ai beaucoup de tels dossiers - ex MA503, MA504 etc., et je veux les parcourir.

J'attribue mes noms de variables à l'aide de caractères génériques -

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

Je veux traiter ces fichiers dans un script, et je veux que ma sortie soit remplacée .atpar .atqt, pour que le nom final ressemble à -

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

j'ai essayé

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

Mon nom de fichier final ressemble à -

*R1*.atqt.fastq

au lieu de mon attente qui était

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq

J'ai tout appris par nécessité sur unix, donc je ne sais pas comment les noms de variables sont traités. Toute aide est appréciée!

Ayush Saxena
la source

Réponses:

13

La commande Forward=*R1*.at.fastqdéfinit la variable Forwardsur la chaîne *R1*.at.fastq(étoile, R majuscule, chiffre 1, étoile, point, A minuscule, etc.). Les caractères génériques ne sont développés que dans des contextes qui autorisent plusieurs mots; la taille de droite d'une affectation de variable attend un seul mot, donc aucune expansion générique ne se produit.

Dans une commande comme cat $Forward, les caractères génériques de la valeur de Forwardsont développés. Lorsqu'une variable est développée en dehors des guillemets doubles, sa valeur est interprétée comme une liste de motifs génériques délimitée par des espaces, et si un motif correspond à un ou plusieurs fichiers, il est remplacé par la liste de fichiers.

Dans ${Forward/.at/.atqt} , la première valeur de la variable est recherchée: *R1*.at.fastq. Ensuite, la substitution de texte est appliquée à cette chaîne, ce qui donne *R1*.atqt.fastq. Le résultat est une expansion de variable sans guillemets, il est donc interprété comme un motif générique. Mais *R1*.atqt.fastqne correspond à aucun fichier, il est donc inchangé.

Pour développer le caractère générique lors de la définition Forward, vous pouvez en faire un tableau.

Forward=(*R1*.at.fastq)

Cela définit Forwardun tableau à 1 élément, l'élément étant la chaîne MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq. Le modèle générique est étendu à la liste des correspondances car il se trouve dans un contexte (les parenthèses de l'affectation de tableau) où plusieurs mots sont attendus.

En bash, $Forwardquand Forwardest un tableau équivaut à ${Forward[0]}- référencer une variable de tableau avec la même syntaxe qu'une variable scalaire fait référence au premier élément du tableau. Vous pouvez donc laisser votre commande awk inchangée.

Gilles 'SO- arrête d'être méchant'
la source
Le script a fonctionné et votre explication me vient très facilement. Merci beaucoup!
Ayush Saxena