Espansione dei parametri nella variabile assegnata con un carattere jolly


8

Ho due file nella mia cartella corrente (MA502) i cui nomi sono -

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

Ho molte di queste cartelle, ad esempio MA503, MA504, ecc., E voglio passare in rassegna quelle.

Assegno i miei nomi di variabili usando i caratteri jolly -

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

Voglio elaborare questi file in uno script, e voglio la mia uscita di sostituire .ata .atqt, in modo che il nome definitivo sarà simile -

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

Provai

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

Il mio nome file finale sembra:

*R1*.atqt.fastq

invece della mia aspettativa che era

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq

Ho imparato tutto per necessità su unix, quindi non sono sicuro di come vengano elaborati i nomi delle variabili. Qualsiasi aiuto è apprezzato!

Risposte:


13

Il comando Forward=*R1*.at.fastqimposta la variabile Forwardsulla stringa *R1*.at.fastq(stella, R maiuscola, cifra 1, stella, punto, A minuscola, ecc.). I caratteri jolly vengono espansi solo in contesti che consentono più parole; la dimensione destra di un'assegnazione variabile prevede una sola parola, quindi non si verifica alcuna espansione con caratteri jolly.

In un comando simile cat $Forward, i caratteri jolly nel valore di Forwardvengono espansi. Quando una variabile viene espansa al di fuori delle doppie virgolette, il suo valore viene interpretato come un elenco delimitato da spazi bianchi di motivi jolly e, se un motivo corrisponde a uno o più file, viene sostituito dall'elenco dei file.

In ${Forward/.at/.atqt}, prima il valore della variabile viene cercato: *R1*.at.fastq. Quindi la sostituzione del testo viene applicata a questa stringa, cedendo *R1*.atqt.fastq. Il risultato è un'espansione variabile non quotata, quindi viene interpretato come un modello jolly. Ma *R1*.atqt.fastqnon corrisponde a nessun file, quindi rimane invariato.

Per espandere il carattere jolly durante l'impostazione Forward, è possibile renderlo un array.

Forward=(*R1*.at.fastq)

Questo imposta Forwardsu un array di 1 elemento, essendo l'elemento la stringa MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq. Il modello jolly viene espanso nell'elenco delle corrispondenze perché si trova in un contesto (parentesi dell'assegnazione di array) in cui sono previste più parole.

In bash, $Forwardwhen Forwardis a array è equivalente a ${Forward[0]}- fare riferimento a una variabile array con la stessa sintassi di una variabile scalare si riferisce al primo elemento dell'array. Quindi puoi lasciare invariato il tuo comando awk.


La sceneggiatura ha funzionato e la tua spiegazione mi arriva molto facilmente. Molte grazie!
Ayush Saxena,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.