Unix 折りたたみコマンドが予期せず動作します。

Unix 折りたたみコマンドが予期せず動作します。

だから私は次のような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

W30に変更すると

>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ファイルですが、きれいではありません。回避策として採用してスクリプトFastaToTblTblToFasta作成できます。以前に投稿したことがあります。そして、次のことを行います。

$ 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

関連情報