forループを使用して、さまざまなファイルから拡張子の前にある4つの任意の文字をどのように削除できますか?

forループを使用して、さまざまなファイルから拡張子の前にある4つの任意の文字をどのように削除できますか?

私は生物情報学に焦点を当てた学部研究プロジェクトを進めており、ファイル処理プロセスを進めています。いくつかの背景知識:私は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ファイルに対して繰り返されます。cutSRRサンプルIDを抽出するために使用され、このIDは一致するファイルを見つけるfindためにコマンドと共に使用されます_2findどのくらいの結果が返されるかわからないので、 の出力は配列に格納されます。

一致なし(悪い)、正確に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/perlshebang行などを使用してを使用して実行可能フラグを設定する場合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

おすすめ記事