web-dev-qa-db-ja.com

ワイルドカードで割り当てられた変数のパラメーター展開

現在のフォルダー(MA502)に2つのファイルがあり、その名前は-

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

MA503、MA504などのフォルダがたくさんあるので、それらを繰り返し処理します。

ワイルドカードを使用して変数名を割り当てます-

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

これらのファイルをスクリプトで処理し、出力で.at.atqtに置き換えて、最終的な名前が次のようになるようにしたいと思います。

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

私は試した

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

最終的なファイル名は次のようになります-

*R1*.atqt.fastq

だった私の期待の代わりに

MA502_TAAGGCGA-TCGCAGG_L001_R1_001.atqt.fastq

UNIXでは必要に応じてすべてを学んだので、変数名がどのように処理されるのかわかりません。どんな助けでもありがたいです!

8
Ayush Saxena

コマンドForward=*R1*.at.fastqは、変数Forwardを文字列*R1*.at.fastq(スター、大文字のR、数字の1、スター、ドット、小文字のAなど)に設定します。ワイルドカードは、複数の単語を許可するコンテキストでのみ展開されます。変数割り当ての右側のサイズは単一のWordを想定しているため、ワイルドカードの展開は行われません。

cat $Forwardのようなコマンドでは、Forwardの値のワイルドカードが展開されます。変数が二重引用符の外側で展開されると、その値は空白で区切られたワイルドカードパターンのリストとして解釈され、パターンが1つ以上のファイルと一致する場合は、ファイルのリストで置き換えられます。

${Forward/.at/.atqt}では、最初に変数の値が検索されます:*R1*.at.fastq。次に、テキスト置換がこの文字列に適用され、*R1*.atqt.fastqが生成されます。結果は引用符で囲まれていない変数展開になるため、ワイルドカードパターンとして解釈されます。ただし、*R1*.atqt.fastqはどのファイルとも一致しないため、変更されません。

Forwardを設定するときにワイルドカードを展開するには、配列にすることができます。

Forward=(*R1*.at.fastq)

これは、Forwardを1要素の配列に設定します。要素は文字列MA502_TAAGGCGA-TCGCAGG_L001_R1_001.at.fastqです。ワイルドカードパターンは、複数の単語が予想されるコンテキスト(配列割り当ての括弧)内にあるため、一致のリストに展開されます。

Bashでは、Forwardが配列である場合の$Forward${Forward[0]}と同等です。スカラー変数と同じ構文で配列変数を参照すると、配列の最初の要素が参照されます。したがって、awkコマンドを変更しないでおくことができます。