複数のペアのファイル名を変更し、その間にある他のバーコード文字列を削除しますか?

複数のペアのファイル名を変更し、その間にある他のバーコード文字列を削除しますか?

ファイルの途中に不要なバーコードラベルを持つ多くのペアリングファイルがあります。たとえば、次のようになります。

LIB008983_TRA00020080_TAAGGCGA-TATCCTCT_L001_R1.fastq.gz
LIB008983_TRA00020080_TAAGGCGA-TATCCTCT_L001_R2.fastq.gz
LIB008983_TRA00020081_TAAGGCGA-AGAGTAGA_L001_R1.fastq.gz
LIB008983_TRA00020081_TAAGGCGA-AGAGTAGA_L001_R2.fastq.gz
LIB008983_TRA00020082_TAAGGCGA-GTAAGGAG_L001_R1.fastq.gz
LIB008983_TRA00020082_TAAGGCGA-GTAAGGAG_L001_R2.fastq.gz
LIB008983_TRA00020083_TAAGGCGA-ACTGCATA_L001_R1.fastq.gz
LIB008983_TRA00020083_TAAGGCGA-ACTGCATA_L001_R2.fastq.gz

ファイルの先頭または末尾にある識別子を変更せずに、バーコード(ファイル全体で異なる)を削除する必要があります。

私はオンラインで読んだことに基づいてスクリプトを直接書いてみましたが、比較的悪い試みのように見えました。

for f in LIB008983_TRA000{19916..20167}_*_L001_R*.fastq.gz;
do
  newName=${f/_*_\ _L001_R*.fastq.gz}
  mv -i "$f" "$newName";
done

私が受け取ったエラーメッセージは次のとおりです。

mv: cannot stat ‘LIB008983_TRA00019917_*_L001_R*.fastq.gz’: No such file or directory

理想的には、最終ファイル名は次のとおりです。

LIB008983_TRA00020136_L001_R1.fastq.gz
LIB008983_TRA00020136_L001_R2.fastq.gz
LIB008983_TRA00020137_L001_R1.fastq.gz
LIB008983_TRA00020137_L001_R2.fastq.gz
..
..

など。

答え1

ここで見ている問題は、forループが予期しない方法で拡張されることです。スコープ{...}演算子は、存在するファイル名だけでなく、すべての可能なファイル名の完全なリストを提供します。

たとえば、ファイル19917が存在しないため、このmvエラーメッセージが表示されます。

echo以下を配置することでこれを確認できます。

for f in LIB008983_TRA000{19916..20167}_*_L001_R*.fastq.gz
do
  echo "$f"
done

これにより、次の出力が提供されます。

LIB008983_TRA00019916_*_L001_R*.fastq.gz
LIB008983_TRA00019917_*_L001_R*.fastq.gz
LIB008983_TRA00019918_*_L001_R*.fastq.gz
...
LIB008983_TRA00020078_*_L001_R*.fastq.gz
LIB008983_TRA00020079_*_L001_R*.fastq.gz
LIB008983_TRA00020080_TAAGGCGA-TATCCTCT_L001_R1.fastq.gz
LIB008983_TRA00020080_TAAGGCGA-TATCCTCT_L001_R2.fastq.gz
...
LIB008983_TRA00020084_*_L001_R*.fastq.gz
LIB008983_TRA00020085_*_L001_R*.fastq.gz
LIB008983_TRA00020086_*_L001_R*.fastq.gz

. を含むすべての行は、*存在しないファイルを表します。

この問題を解決する方法は2つあります。まず範囲を維持するには、以下をテストしますmv

  if [ -f "$f" ]
  then
    mv -i "$f" "$newName"
  fi

これで、mvファイルが存在する場合にのみコマンドが実行されます。

2番目の方法は、範囲に興味がない場合は、globパターンを一致させることです。

for f in LIB008983_TRA000*_*_L001_R*.fastq.gz
do
  newName=${f/_*_\ _L001_R*.fastq.gz}
  mv -i "$f" "$newName"
done

mvどちらの場合も、もはや存在しないファイルを試みません。

参考までに、これらのいくつかは必要ありませんので、;答えから削除しました。

2番目の問題があります。 「$newName」が望むものではありません。私は昔ながらのkshコーダーであり、それを表現するより良い方法があるかもしれませんが、次bashのようなことをします。

  tail=L${f##*_L}
  head=${f%_*_$tail}_
  newName="$head$tail"
  mv -i "$f" "$newName"

入力ファイルのリストが与えられたら

LIB008983_TRA00020080_L001_R1.fastq.gz
LIB008983_TRA00020080_L001_R2.fastq.gz
LIB008983_TRA00020081_L001_R1.fastq.gz
LIB008983_TRA00020081_L001_R2.fastq.gz
LIB008983_TRA00020082_L001_R1.fastq.gz
LIB008983_TRA00020082_L001_R2.fastq.gz
LIB008983_TRA00020083_L001_R1.fastq.gz
LIB008983_TRA00020083_L001_R2.fastq.gz

関連情報