
私は生物情報学に焦点を当てた学部研究プロジェクトを進めており、ファイル処理プロセスを進めています。いくつかの背景知識:私はA、T、G、C(DNAサンプルのヌクレオチド)の非常に大きなサンプルであるShotgunメタゲノムデータと私が収集したいくつかの修飾子を使って作業しています。いくつかのファイルをトリミングしてクリーンアップし、いくつかの修飾子を追加するパイプラインのいくつかの手順を完了しました。重要なことは、これらの読み取りはほとんど双方向読み取りであるため、両方のファイルがヌクレオチドを右から左に、左から右に読み取ることを意味します。
それ以前は、基本的に生物学と生態学だけが頭の中に振り回されたため、コーディングや仕事がどのように/なぜなされたのか、一般的な慣行/特徴などについての背景知識はまったくありませんでした。あなたは理解しました。
つまり、私はUNIXで非常に基本的なforループと文字列操作を自分で学び、さまざまなモジュールと機能を使用してさまざまなフォルダで実行されるいくつかのbashファイルを作成しました。サンプルコードは次のとおりです。
cd ~/ncbi/public/sra/indian
for forward_read_file in *_1.fastq
do
rev=_2
reverse_read_file=${forward_read_file/_1/$rev}
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i ${forward_read_file} -irev ${reverse_read_file} -c 1 -t5 -t3
rm ${forward_read_file} ${reverse_read_file}
done
#CAMEROON
cd ~/ncbi/public/sra/cameroon
for forward_read_file in *_1.fastq
do
rev=_2
reverse_read_file=${forward_read_file/_1/$rev}
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i ${forward_read_file} -irev ${reverse_read_file} -c 1 -t5 -t3
rm ${forward_read_file} ${reverse_read_file}
done
多くのフォルダなどについて。私は文字列操作を使用してforループの各反復を介してペアの最終ファイルを呼び出して、使用しているモジュールのいくつかのパラメータとパラメータを取得します。
今私が持っている最大の問題は、パイプラインの次のステップのために最終ファイルをペアにする方法を見つけることができないことです。拡張子の前に任意の4文字があり、これを予測できないからです。意味のあるデータが含まれていないため、ファイル名からそのデータを削除し、以前と同様に続行する予定です。
以下は質問ファイルの例です。質問は文字列の末尾にある4文字です。これを削除すると、通常どおり文字列操作を実行できます。
SRR5898908_1_prinseq_good_ZsSX.fastq SRR5898928_2_prinseq_good_VygO.fastq SRR5898979_1_prinseq_good_CRzI.fastq SRR6166642_2_prinseq_good_nqVP.fastq SRR6166693_2_prinseq_good_y_OD.fastq
SRR5898908_2_prinseq_good_HPTU.fastq SRR5898929_1_prinseq_good_p2mS.fastq SRR5898979_2_prinseq_good_vYcE.fastq SRR6166643_1_prinseq_good_fc8y.fastq SRR6166694_1_prinseq_good_Ka1C.fastq
SRR5898909_1_prinseq_good_X41r.fastq SRR5898929_2_prinseq_good_uO8g.fastq SRR5898980_1_prinseq_good_WuPS.fastq SRR6166643_2_prinseq_good_QUUK.fastq SRR6166694_2_prinseq_good_ZlNk.fastq
SRR5898909_2_prinseq_good_GbmA.fastq SRR5898930_1_prinseq_good_3qyA.fastq
最初のSRRxxxxxはサンプルであり、1または2これはそれぞれ順方向読み取りと逆方向読み取りであるため、文字列操作です。問題は文字列の末尾にある4つの文字です。これを削除すると、通常どおり文字列操作を実行できます。メンターは何とかFINDやCUT関数を使うように提案し、findの戻り値を操作変数として使う方法についても話しましたが、それでも同じ問題が発生するような感じがします。
forループを使用してこれらの文字を安全に削除するにはどうすればよいですか?それとも、あなたが最もうまくいくと思うものは何でも。
ありがとうございます!
答え1
次のようにしてみてください。
for forward_read_file in *_1*.fastq; do
srr=$(echo "$forward_read_file" | cut -d_ -f1)
rrf_array=( $(find . -name "${srr}_2_*.fastq") )
case "${#rrf_array[@]}" in
0) echo "Warning: No reverse read file found for $forward_read_file" > /dev/stderr ;;
1) reverse_read_file="${rrf_array[1]}"
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
;;
*) echo "Error: multiple reverse read files found for $forward_read_file" > /dev/stderr ;;
esac
done
これはすべての_1
ファイルに対して繰り返されます。cut
SRRサンプルIDを抽出するために使用され、このIDは一致するファイルを見つけるfind
ためにコマンドと共に使用されます_2
。 find
どのくらいの結果が返されるかわからないので、 の出力は配列に格納されます。
一致なし(悪い)、正確に1つの一致(良い、これが私たちが望むもの)、1つ以上の一致(再び悪い)の3つの可能な結果を処理します。
結果が1つしかない場合は、配列から一致するファイルを抽出し、Perlスクリプトを使用して処理します。
結果が0個以上の場合、警告メッセージがstderrに印刷され、次の_1
ファイル名で処理が続行されます。必要に応じて、; exit 1
これらの状況の前に追加(またはエラーを処理するための他のコード)することができます。;;
_1
これは、SRRサンプルIDの先頭と順方向または逆方向のペアファイルで識別されるORを除いて、ファイル名のすべての部分を無視します。_2
if; then; else
ちなみに、これはドアの代わりに行うことができますが、ゼロとcase
いくつかのケースを異なる方法で処理するのが便利だと思います。例えば
if [ "${#rrf_array[@]}" == 1 ];
reverse_read_file="${rrf_array[1]}"
perl /home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
else
echo "Warning: unknown problem with reverse read file for $forward_read_file" > /dev/stderr
fi
「問題」ファイルを無視するには、このelse
ブロックを削除します。
ちなみに、スクリプトを読みやすくするには、スクリプトの上部付近で次のことをお勧めします。
AFilter='/home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/AmbiguityFiltering.pl'
それから:
perl "$AFilter" -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
または、Perlスクリプトが実行可能な場合(たとえば、#!/usr/bin/perl
shebang行などを使用してを使用して実行可能フラグを設定する場合chmod +x
)、/home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming/
$ PATHに追加するだけです。
PATH="$PATH:/home/gomeza/shared/sharm646-2021-02-24-09_22/Softwares/NGSQCToolkit_v2.3.3/Trimming"
次のようにスクリプトを実行します。
AmbiguityFiltering.pl -i "$forward_read_file" -irev "$reverse_read_file" -c 1 -t5 -t3
答え2
タイトルから名前を変更するという意味ですか?
このように:
cat a2 | sed -e 's|\(.*\)\(good_\)\(.*\)\(.fastq\)|mv \1\2\3\4 \1\2\4|'
mv SRR5898908_1_prinseq_good_ZsSX.fastq SRR5898908_1_prinseq_good_.fastq
mv SRR5898928_2_prinseq_good_VygO.fastq SRR5898928_2_prinseq_good_.fastq