だから私は次のようなfasta(生物学)ファイルを持っています:
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCAGAACACCTGGTTTCACGACC
ATAAATAATTTACCAGTGAATCGAGGCTCAATTATAGATCCTCGGACGCGAGTTCTCGGTTGACGAGTGG
GATTCGAATTATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAATTTGTTCGGGATAAAATCATC
TGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCAATGAATTTTAAATAATCATCGGACATACCA
ATTTTTGGAACAATAATGTTCCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC
各行の長さは最大70文字です。通常、最大50文字の長さでフォーマットするには、次のようにします。
Fold -50 input.fasta > output.fasta # -b と -w args も試みる
しかし、どういうわけかこれはうまくいきません。ファイルは私が見た他の多くのファイルと同じように見えます。これで出力は次のようになります。
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCA
GAACACCTGGTTTCACGACC
ATAAATAATTTACCAGTGAATCGAGGCTCAATTATAGATCCTCGGACGCG
AGTTCTCGGTTGACGAGTGG
GATTCGAATTATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAAT
TTGTTCGGGATAAAATCATC
TGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCAATGAATTTTA
AATAATCATCGGACATACCA
ATTTTTGGAACAATAATGTTCCGAACATCCCGAAAATATAGGAAGAGCCC
押し出された20文字をカットして下に正しく配置しますが、次の行に接続せずに最大50文字に縮小します。
以前に作成されたfastaファイルに戻りましたが、折りたたみコマンドはまだうまくいきました。新しいファイルの一部をコピーして別のファイルに貼り付けても問題は解決しません。
私が知らないエンコーディングの問題があるようです。誰でも助けることができますか?
乾杯、
編集:良い答えです。ありがとうございます!
答え1
あなたの問題はファイルエンコーディングとは関係ありません。このfold
ユーティリティは非常にプリミティブであり、特定の長さの行を切断しますが、接続しません。
fastaヘッダー行を保存するように注意することもできます(つまり、縮小しないでください)。
awk -v W=50 '
/^>/ { if (seq != "") print seq; print; seq = ""; next }
{
seq = seq $1
while (length(seq) > W) {
print substr(seq, 1,W)
seq = substr(seq, 1+W)
}
}
END { if (seq != "") print seq }' file.fa
このawk
コマンドは、ヘッダー行を変更せずにシーケンスを50文字に再フォーマットします。幅50はW
変数で調整可能で、正の整数に設定できます。
コードの最初のブロックはヘッダー行を処理し、前のシーケンスで累積されたシーケンスビット(出力が残っている場合)を出力し、未変更のヘッダー行を出力に渡します。
2番目のブロックは一連の行を累積し、累積シーケンスが十分に長い場合は、累積シーケンスを適切なチャンクとして出力できます。
最後のブロック(END
)は、入力の終わりに達すると残りのシーケンスを出力します。
シーケンスの2つのコピーを含むファイルに対してこのコマンドを実行すると、
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCA
GAACACCTGGTTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCA
ATTATAGATCCTCGGACGCGAGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAATTTGTTCGGGA
TAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCA
ATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCA
GAACACCTGGTTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCA
ATTATAGATCCTCGGACGCGAGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAATTTGTTCGGGA
TAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCA
ATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC
W
30に変更すると
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATC
AAATAATTTCATTCGCGTCAGAACACCTGG
TTTCACGACCATAAATAATTTACCAGTGAA
TCGAGGCTCAATTATAGATCCTCGGACGCG
AGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGT
TCAGATAAATTTGTTCGGGATAAAATCATC
TGAGTAGGTCGGGCTTCTGAATTTCGTATT
CTTGCGAGCAATGAATTTTAAATAATCATC
GGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCC
GGATAGATAAAAATAAACAC
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATC
AAATAATTTCATTCGCGTCAGAACACCTGG
TTTCACGACCATAAATAATTTACCAGTGAA
TCGAGGCTCAATTATAGATCCTCGGACGCG
AGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGT
TCAGATAAATTTGTTCGGGATAAAATCATC
TGAGTAGGTCGGGCTTCTGAATTTCGTATT
CTTGCGAGCAATGAATTTTAAATAATCATC
GGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCC
GGATAGATAAAAATAAACAC
あなたも正しいかもしれません。 。 。興味があるFASTX ツールキットCSHLから。私はこれを直接使用したことがありませんが、「FASTAフォーマッタ(FASTAファイルのシーケンスライン幅の変更)」が含まれているようです。これらのツールの最新バージョンは2014年(非常に古いバージョン)なので、特定のUnixディストリビューションでパッケージを提供しない限り(パッケージリポジトリを確認する)、提供されたプリコンパイルされたバイナリの1つを使用するのではなく、ソースから直接コンパイルすることをお勧めします。
答え2
この試み:
<input.fasta tr -d '\n'|fold -w 50 >output.fasta
これにより、tr
既存の行の末尾が削除され、結果の単一行が最大長50の複数行にフォーマットされます。
最初の行を現在の長さに保ち、後続の行と組み合わせたくない場合は、次のようにします(そして行の終わりに出力が終了します)。
awk '{if (NR==1) {print $0 gensub(/ /, " ", "g", sprintf("%*s", 50-length($0), ""))} else print $0}' input.fasta|tr -d '\n'|sed '$s/$/\n/'|fold -w 50|awk '{$1=$1};1' >output.fasta
答え3
これがfold
うまくいく方法です。以前はこんなに長い行がなかったので、一度も種を振りかけたことがありません。折りたたみは各行で個別に行われます。したがって、線の長さが折りたたむサイズの正確な倍数でない場合は、この出力が得られます。たとえば、
$ perl -le 'for (0..2){print "A" x 12}'
AAAAAAAAAAAA
AAAAAAAAAAAA
AAAAAAAAAAAA
$ perl -le 'for (0..2){print "A" x 12}' | fold -w 6
AAAAAA
AAAAAA
AAAAAA
AAAAAA
AAAAAA
AAAAAA
$ perl -le 'for (0..2){print "A" x 12}' | fold -w 7
AAAAAAA
AAAAA
AAAAAAA
AAAAA
AAAAAAA
AAAAA
今これは本当に問題ではありません。これはまだ有効なfastaファイルですが、きれいではありません。回避策として採用してスクリプトFastaToTbl
をTblToFasta
作成できます。以前に投稿したことがあります。そして、次のことを行います。
$ FastaToTbl input.fasta | TblToFasta
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCAGAACACCTGG
TTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCAATTATAGATCCTCGGACGCG
AGTTCTCGGTTGACGAGTGGGATTCGAATTATTTTTCACCGAAAATTTTAGTCGACGAGT
TCAGATAAATTTGTTCGGGATAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATT
CTTGCGAGCAATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC
このTblToFasta
スクリプトは、出力がラインあたり標準60bpであることを確認します。本当に50個が必要な場合は、次のようにすることができます(GNU仮定sed
):
$ FastaToTbl input.fasta | sed -E 's/^/>/;s/\t/\n/ ' | sed -E 's/(.{50})/\1\n/g'
>m64093_191209_130050/133911/ccs_64
TTCAGGCTGTGTTCCATTTGATTTAAAATCAAATAATTTCATTCGCGTCA
GAACACCTGGTTTCACGACCATAAATAATTTACCAGTGAATCGAGGCTCA
ATTATAGATCCTCGGACGCGAGTTCTCGGTTGACGAGTGGGATTCGAATT
ATTTTTCACCGAAAATTTTAGTCGACGAGTTCAGATAAATTTGTTCGGGA
TAAAATCATCTGAGTAGGTCGGGCTTCTGAATTTCGTATTCTTGCGAGCA
ATGAATTTTAAATAATCATCGGACATACCAATTTTTGGAACAATAATGTT
CCGAACATCCCGAAAATATAGGAAGAGCCCGGATAGATAAAAATAAACAC