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


8

現在のフォルダー(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では必要に応じてすべてを学んだので、変数名がどのように処理されるのかわかりません。どんな助けでもありがたいです!

回答:


13

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

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

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

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

Forward=(*R1*.at.fastq)

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

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


スクリプトはうまくいきました、そしてあなたの説明は私にとても簡単に来ます。どうもありがとう!
Ayush Saxena、2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.