Expansión de parámetros en variable asignada con un comodín

8

Tengo dos archivos en mi carpeta actual (MA502) cuyos nombres son:

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

Tengo muchas de esas carpetas, por ejemplo, MA503, MA504, etc., y quiero recorrerlas.

Asigno mis nombres de variables usando comodines:

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

Quiero procesar estos archivos en un script, y quiero que mi salida para reemplazar .ata .atqt, por lo que el nombre final se vería -

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

Lo intenté

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

Mi nombre de archivo final se ve así:

*R1*.atqt.fastq

en lugar de mi expectativa que era

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq

Aprendí todo por necesidad en Unix, así que no estoy seguro de cómo se procesan los nombres de variables. Cualquier ayuda es apreciada!

Ayush Saxena
fuente

Respuestas:

13

El comando Forward=*R1*.at.fastqestablece la variable Forwarden la cadena *R1*.at.fastq(estrella, R mayúscula, dígito 1, estrella, punto, A minúscula, etc.). Los comodines solo se expanden en contextos que permiten varias palabras; el tamaño de la mano derecha de una asignación variable espera una sola palabra, por lo que no se produce expansión de comodines.

En un comando como cat $Forward, los comodines en el valor de Forwardse expanden. Cuando una variable se expande fuera de las comillas dobles, su valor se interpreta como una lista delimitada por espacios en blanco de patrones comodín, y si algún patrón coincide con uno o más archivos, se reemplaza por la lista de archivos.

En ${Forward/.at/.atqt}primer lugar el valor de la variable se busca: *R1*.at.fastq. Luego, la sustitución de texto se aplica a esta cadena, produciendo *R1*.atqt.fastq. El resultado es una expansión variable sin comillas, por lo que se interpreta como un patrón comodín. Pero *R1*.atqt.fastqno coincide con ningún archivo, por lo que no se modifica.

Para expandir el comodín cuando se configura Forward, puede convertirlo en una matriz.

Forward=(*R1*.at.fastq)

Esto se establece Forwarden una matriz de 1 elemento, siendo el elemento la cadena MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq. El patrón comodín se expande a la lista de coincidencias porque está en un contexto (paréntesis de asignación de matriz) donde se esperan varias palabras.

En bash, $Forwardcuando Forwarduna matriz es equivalente a ${Forward[0]}- hacer referencia a una variable de matriz con la misma sintaxis que una variable escalar se refiere al primer elemento de la matriz. Para que pueda dejar su comando awk sin cambios.

Gilles 'SO- deja de ser malvado'
fuente
El guión funcionó y su explicación me resulta muy fácil. ¡Muchas gracias!
Ayush Saxena