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