200文字ごとに\ n + ">"と数字ヘッダを追加して行を区切る方法は?

200文字ごとに\ n + ">"と数字ヘッダを追加して行を区切る方法は?

連続したシーケンスがあり、200文字ごとに\ nと>を追加してグループを区別したいと思います。私はsedとawkの使用が役に立つと思いますが、私はこれに精通していません。

これが私の入力になります:

ATACAGTTGGGTTTGGTTGGATCTTCGTCGGTATTTTTATTGGGTTAATTCTCTGGTTTTTCATCAACCGCGCCAGCGTCAGAGCGAACAGGCAGGTTGAATTACTTGAGTCTATCGACCAGAAATTATCAAAAATAGTAGATCCAAACTTCGAGGCAAATAACAAAGACCAGTCGAAAGAAAACTACCTTGAAGAAGCATGGGAAAACAGCATTCAGCGGTGGCTTATTCCTGCTAAGGATGTTGGCCGCATTCATGCTGAGCACAACCTCGACGGCCTGCTGAGGGGCGATTCGGCATCCCGCGCTGCCTTTATGAAGGCAATGGGAGAGGCAGGGCTACGCACCATCAACGAGATGCGACGAACGGACAACCTCCCGCCATTGCCGGGTGGCGATGTGAAATGGGAACCGCGAACATGCCTGCACATCCGTTTGTGCGACCCGCTTACGATACTCGCGAGGAAGAGGCCGCCAGCGTCGCCATTGCCAGGATGAATCAGGCTATTGATGAGGTATTGAGCAAGTGAATGAAGATAATATCTACGCCTTGCTTTCTCCCCTGGCAGAAGGACGGGTATATCCCTATGTTGCGCCATTA

これは私の予想結果です(>カンマを除く)。

>1
ATACAGTTGGGTTTGGTTGGATCTTCGTCGGTATTTTTATTGGGTTAATTCTCTGGTTTTTCATCAACCGCGCCAGCGTCAGAGCGAACAGGCAGGTTGAATTACTTGAGTCTATCGACCAGAAATTATCAAAAATAGTAGATCCAAACTTCGAGGCAAATAACAAAGACCAGTCGAAAGAAAACTACCTTGAAGAAGCA
>2
TGGGAAAACAGCATTCAGCGGTGGCTTATTCCTGCTAAGGATGTTGGCCGCATTCATGCTGAGCACAACCTCGACGGCCTGCTGAGGGGCGATTCGGCATCCCGCGCTGCCTTTATGAAGGCAATGGGAGAGGCAGGGCTACGCACCATCAACGAGATGCGACGAACGGACAACCTCCCGCCATTGCCGGGTGGCGATGT
>3
GAAATGGGAACCGCGAACATGCCTGCACATCCGTTTGTGCGACCCGCTTACGATACTCGCGAGGAAGAGGCCGCCAGCGTCGCCATTGCCAGGATGAATCAGGCTATTGATGAGGTATTGAGCAAGTGAATGAAGATAATATCTACGCCTTGCTTTCTCCCCTGGCAGAAGGACGGGTATATCCCTATGTTGCGCCATTA

どんな提案がありますか?事前にありがとう

ㅏ。

答え1

perlRSを\ 200に初期化して、一度に200バイトを読み取ることができます。ファイルにバイトと同じ文字があるとします。

$ perl -ne '
    BEGIN { $/ = \200; $\ = "\n" }
    chop if /\n/;
    last if /^$/;
    ++$k; print s/^/>$k\n/r;
' file

答え2

複数文字のRSとRTにGNU awkを使用する:

$ awk -v RS='.{200}' 'RT{print ">" NR ORS RT}' file
>1
ATACAGTTGGGTTTGGTTGGATCTTCGTCGGTATTTTTATTGGGTTAATTCTCTGGTTTTTCATCAACCGCGCCAGCGTCAGAGCGAACAGGCAGGTTGAATTACTTGAGTCTATCGACCAGAAATTATCAAAAATAGTAGATCCAAACTTCGAGGCAAATAACAAAGACCAGTCGAAAGAAAACTACCTTGAAGAAGCA
>2
TGGGAAAACAGCATTCAGCGGTGGCTTATTCCTGCTAAGGATGTTGGCCGCATTCATGCTGAGCACAACCTCGACGGCCTGCTGAGGGGCGATTCGGCATCCCGCGCTGCCTTTATGAAGGCAATGGGAGAGGCAGGGCTACGCACCATCAACGAGATGCGACGAACGGACAACCTCCCGCCATTGCCGGGTGGCGATGT
>3
GAAATGGGAACCGCGAACATGCCTGCACATCCGTTTGTGCGACCCGCTTACGATACTCGCGAGGAAGAGGCCGCCAGCGTCGCCATTGCCAGGATGAATCAGGCTATTGATGAGGTATTGAGCAAGTGAATGAAGATAATATCTACGCCTTGCTTTCTCCCCTGGCAGAAGGACGGGTATATCCCTATGTTGCGCCATTA

答え3

潜在的に重いパーサーと正規表現を避けるための可能な解決策は、次のパイプラインです。このパイプラインはXSIオプションでPOSIX機能のみを使用するため、すべてのUNIXシステムで動作する必要があります。

tr -d '\n' | dd cbs=200 conv=unblock | nl -n ln | tr '\t' '\n' | paste -d '>\n' /dev/null - -

cat file |たとえば、ファイルを保存するには、コマンドを前に追加してファイルを標準入力として供給する必要がありますfile

このコマンドは、末尾の改行を削除しtr、行を200バイトのチャンクに分割し、データの左側の数字をタブで区切り、各行に番号を付け、次のコマンドを使用して改行に置き換え、前に文字を追加します。出力を使い慣れます。数字paste>

答え4

GNUの使用awk:

awk -v FPAT='.{200}' '{ while(++num<=NF) print ">"num RS $num; }' infile

上記のコマンドは、行が常にモジュールとして200の場合にのみ機能します。それ以外の場合は、残りの文字を印刷する必要がある場合、または行が200文字未満の場合に機能します。

awk -v FPAT='.{200}' '{ while(++num<=NF) print ">"num RS $num; };
END{
    if (length($0)%200)
        print ">" num RS substr($0, int(length($0)/200)*200+1, length($0)%200);
}' infile

関連情報