複数のマルチファスタファイルのヘッダー名を変更する

複数のマルチファスタファイルのヘッダー名を変更する

P名前PANS_1_2、、、、で始まるfastaファイルがいくつかありPANS_1_5ます。PANS_200_2PANS_200_2

ファイルには次のタイトルがあります。

>1_1262659_105.258519
>2_809301_107.252177
>3_422941_112.146787
>4_413692_100.238323

このファイルのヘッダをfilename_ctg1PANS_1_2

>PANS_1_2_ctg1
>PANS_1_2_ctg2
>PANS_1_2_ctg3

次のコードを試しました。

for sample in P*;do echo -en $sample;awk '/>.*/{sub(/[^>]*/,">$sample_ctg"++i)}1' $sample;done > $sample.fasta

上記のスクリプトは目的の出力を生成しません。

答え1

そしてawk

awk 'FNR==1{ close(out); inc=0; fileName=substr(FILENAME,3); out=fileName".fasta" } 
     /^>/{ $0= ">"fileName"_ctg"(++inc) }
     { print > out }' ./P*

FILENAMEアッ現在処理中の入力ファイルの名前を保持する変数。fileNameファイル./名にプレフィックスポイントスラッシュを使用して./ファイルを読み取るときに、このような名前のPANS=1_2問題を回避します。awkひもとして変えるawkコードの後ろに表示される場合。

二重引用符 "..."内のすべての内容は実際には文字列です。

++inc各ヘッダーに番号を付けて再リセットする事前増分算術式です。0FNR==1次の入力ファイルに使用します。

$0行全体/レコードを表すため、その文字で始まる行をawk更新()してから、「>」文字を使用します。$0= ...>ファイル名その後、_ctg文字列と増分数字が続きます。

3行目では、print現在の行の値は、現在の行と同じ名前のファイル名です。ファイル名リーダーアッそしてここに「.fasta」文字列も追加します。

答え2

forループでGNU sedを使用します。

tmp=$(mktemp)
for sample in ./P*; do
  knt=$(grep -c '^>' < "$sample") || continue
  seq -f ">${sample}_ctg%g" "$knt" > "$tmp"
  sed -e "/^>/R $tmp" -e '//d' < "$sample" > "$sample.fasta"
done
  • 与えられたサンプルファイルのヘッダー数を取得します。
  • 前の手順のサンプルファイル名とヘッダーの数に基づいて追加するヘッダーを構成します。
  • 各ヘッダー行を前の手順で作成したヘッダーファイルから読み取ってから行に置き換えます。

関連情報