複数のfastqファイルを関連付ける

複数のfastqファイルを関連付ける

ほぼ 100 個のファイルを含むフォルダがあり、各グループには 16 個のファイルがあります。 16個のファイルで構成される各グループを1つのファイルにリンクする必要があります。たとえば、ファイル名のセットは次のようになります。

randomString_$groupName- 

Nextseq500で実行され、一本鎖である100本に近いサンプルを含むフォルダがあります。各サンプルは、4つのレーンを持つNextseq500の4つのフローセルで実行されました。したがって、サンプルごとに16個のfastqファイルが生成されます(下記の例を参照)。さて、これらすべてのファイルをリンクし、次の名前の出力を生成したいと思います。102697-001-001_R1.fastq.gz

HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz

HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz

HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz

HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L001_R1.fastq.gz
HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L002_R1.fastq.gz
HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L003_R1.fastq.gz
HJJMYBGXX_102697-001-001_ATTACTCG-GCCTCTAT_L004_R1.fastq.gz

上記のすべてのファイルは、名前付きの1つのファイルにリンクする必要があります102697-001-001_R1.fastq.gz(したがって、2つのファイル間の文字列を名前_のままにしてください)。_

私は試した:

$ cat HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGTLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGVLWBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L001_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L002_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L003_R1.fastq.gz \
HGWWHBGXX_102697-001-001_ATTACTCG-AGGCTATA_L004_R1.fastq.gz > 102697_001_001_R1.fastq.gz

うまくいきますが、ファイルが多いので手動で実行したくありません。

答え1

for name in ./*.fastq.gz; do
    rnum=${name##*_}
    rnum=${rnum%%.*}

    sample=${name#*_}
    sample=${sample%%_*}

    cat "$name" >>"${sample}_$rnum.fastq.gz"
done

これは現在のディレクトリのすべての圧縮されたFastqファイルを繰り返し、サンプル名をシェル変数として抽出しますsample。質問に表示されるすべてのファイル名は102697-001-001

この変数はファイル名の末尾にあるビットをrnum保持します。R#

ファイル名を取得し、最初の文字の前のすべての項目を削除し、最初の文字の後のすべての項目を削除し、結果から最初の文字を含むサンプル名を_抽出_します。rnum同様に変数の値を抽出します。

次に、このファイルはcat >>。出力ファイル名はR#サンプル名と文字列で構成されています.fastq.gz。表示されたファイルの場合、これは102697-001-001_R1.fastq.gz

Gzip圧縮ファイルは、接続するために解凍する必要はありません。結果ファイルを解凍すると、すべてのFastqファイルが非圧縮接続として提供されます。


bash正規表現を使用して出力ファイル名を計算する別の方法は次のとおりです。

for name in ./*.fastq.gz; do
    if [[ "$name" =~ _([0-9-]+)_.*(..)\.fastq\.gz ]]; then
        outfile="${BASH_REMATCH[1]}_${BASH_REMATCH[2]}.fastq.gz"

        cat "$name" >>"$outfile"
    fi
done

ファイル名が正規表現と一致します。

_([0-9-]+)_.*(..)\.fastq\.gz

これら2つのグループ(括弧内のビット)は、ファイル名の関連部分を選択します。最初のグループは文字列をキャプチャします。ただ数字またはダッシュ文字で構成されます。グループは_両側に囲まれなければなりません。ファイル名内のこのビットが一致する唯一の場所はサンプル名です。

最初のグループと_後続のグループの後には、.*そのビットまでの任意の文字()を許可します(..)\.fastq\.gz。ファイル名の末尾にある文字列\.fastq\.gzと一致するため、最後のグループは直前の文字列をキャプチャします(パターンは任意の文字と一致しますが点と一致します)。.fastq.gz(..)R1.\.

キャプチャされた2つのグループは、配列にインデックス1と2 BASH_REMATCH(名前は「Bash正規表現一致」の略)として格納され、それを使用して出力ファイル名を設定します。

答え2

私は私の仕事と非常によく似た仕事をしなければなりません。

私にとって最もクリーンな解決策は次のとおりです。

ls *.fastq.gz | cut -d '_' -f2 | sort | uniq | parallel -j 16 'cat *{}*.fastq.gz > {}_R1.fastq.gz'

このコードでは、私は:

  1. 拡張子を持つすべてのファイルを見つけます.fastq.gz。 **ファイル名に特殊文字(例:!?'')を含めることはできません。私のコメントに対するadminbeeの回答をご覧ください。
  2. cut(1)の出力は区切り文字で保存され、_2番目の出力は(-f2)として保存されます。
  3. sortcutテキスト
  4. 一意の(たとえばuniq)テキストのみを保持
  5. に固有のテキストを送信しますparallel
  6. parallel最大16の位置が有効になりました(-j 16)。
  7. 各並列ジョブに対してコマンドを実行する
    'cat *{}*.fastq.gz > {}_R1.fastq.gz'
    
    このコードは、コードが実行されるディレクトリ内のinput()と一致するcatすべてのファイルをリンクする必要があります。出力ファイルを呼び出します。{}uniq102697-001-001_R1.fastq.gz

自動的にキャプチャされないことを知っていますR1。誰かがR1私のコードでこれを捉える方法を提案できますか?

このコードの最大の利点は、これを次のように実行することです。みんなカタログの一意の例です。 16個のサンプル(つまり、Sample1_L001.fastqand Sample1_L002.fastq;Sample2_L001Sample2_L002;など...)から32個のファイルがあります。このコードは、サンプルを介してすべての項目を一度にリンクします。だから私はSample1.fastqSample2.fastqなどで終わりました。

関連情報