Parametererweiterung in einer mit einem Platzhalter zugewiesenen Variablen

8

Ich habe zwei Dateien in meinem aktuellen Ordner (MA502), deren Namen -

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

Ich habe viele solcher Ordner - zB MA503, MA504 usw., und ich möchte diese durchlaufen.

Ich ordne meine Variablennamen mit Platzhaltern zu -

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

Ich möchte diese Dateien in einem Skript verarbeiten, und ich möchte , dass meine Ausgabe zu ersetzen , .atum .atqt, so dass der endgültige Name aussehen würde -

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

Ich habe es versucht

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

Mein endgültiger Dateiname sieht aus wie -

*R1*.atqt.fastq

anstelle meiner Erwartung was war

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq

Ich habe unter Unix notwendigerweise alles gelernt, daher bin ich mir nicht sicher, wie Variablennamen verarbeitet werden. Jede Hilfe wird geschätzt!

Ayush Saxena
quelle

Antworten:

13

Der Befehl Forward=*R1*.at.fastqsetzt die Variable Forwardauf die Zeichenfolge *R1*.at.fastq(Stern, Großbuchstabe R, Ziffer 1, Stern, Punkt, Kleinbuchstabe A usw.). Platzhalter werden nur in Kontexten erweitert, die mehrere Wörter zulassen. Die rechte Größe einer Variablenzuweisung erwartet ein einzelnes Wort, sodass keine Platzhaltererweiterung erfolgt.

In einem Befehl wie cat $Forwardwerden die Platzhalter im Wert von Forwarderweitert. Wenn eine Variable außerhalb von doppelten Anführungszeichen erweitert wird, wird ihr Wert als durch Leerzeichen getrennte Liste von Platzhaltermustern interpretiert. Wenn ein Muster mit einer oder mehreren Dateien übereinstimmt, wird es durch die Liste der Dateien ersetzt.

In ${Forward/.at/.atqt}wird zuerst der Wert der Variablen nachgeschlagen : *R1*.at.fastq. Dann wird die Textsubstitution auf diese Zeichenfolge angewendet, was ergibt *R1*.atqt.fastq. Das Ergebnis ist eine nicht zitierte Variablenerweiterung, die als Platzhaltermuster interpretiert wird. Stimmt *R1*.atqt.fastqaber nicht mit einer Datei überein, so dass sie unverändert bleibt.

Um den Platzhalter beim Einstellen zu erweitern Forward, können Sie ihn zu einem Array machen.

Forward=(*R1*.at.fastq)

Dies setzt Forwardauf ein 1-Element-Array, wobei das Element die Zeichenfolge ist MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastq. Das Platzhaltermuster wird auf die Liste der Übereinstimmungen erweitert, da es sich in einem Kontext (den Klammern der Array-Zuweisung) befindet, in dem mehrere Wörter erwartet werden.

$ForwardWenn in bash Forwardein Array äquivalent zu ist ${Forward[0]}- Verweisen auf eine Arrayvariable mit derselben Syntax wie eine skalare Variable bezieht sich auf das erste Element des Arrays. So können Sie Ihren awk-Befehl unverändert lassen.

Gilles 'SO - hör auf böse zu sein'
quelle
Das Skript hat funktioniert, und Ihre Erklärung fällt mir sehr leicht. Vielen Dank!
Ayush Saxena