P
名前PANS_1_2
、、、、で始まるfastaファイルがいくつかありPANS_1_5
ます。PANS_200_2
PANS_200_2
ファイルには次のタイトルがあります。
>1_1262659_105.258519
>2_809301_107.252177
>3_422941_112.146787
>4_413692_100.238323
このファイルのヘッダをfilename_ctg1
。PANS_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
- 与えられたサンプルファイルのヘッダー数を取得します。
- 前の手順のサンプルファイル名とヘッダーの数に基づいて追加するヘッダーを構成します。
- 各ヘッダー行を前の手順で作成したヘッダーファイルから読み取ってから行に置き換えます。