シーケンスを固定幅に分割する

シーケンスを固定幅に分割する

このようなファイルがあります。これは、タブで区切られた2つの列で構成されるファイルです。

CTGCAGTTTCCCCAAATGTGGGAAACTTGACTGTATAATTTGTGGCAGTGGTA   a1
GATTTCCCCAAATGTGGGAAACTCACTCGGCAGGCGTTGATA  a2

次のような出力を得たいと思います。

>a1
CTGCAGTTTCCCCAAATGTG
GGAAACTTGACTGTATAATT
TGTGGCAGTGGTA
>a2
GATTTCCCCAAATGTGGGAA
ACTCACTCGGCAGGCGTTGA
TA

内部で折りたたみコマンドを使用しようとしています。アッ。他のコマンドを使用できますかawk

また、各行の希望の幅は15なので、次のように試しましたが、うまくいきませんでした。

awk -F "\t" '{a=$(fold -w 50 $1);print a,$2}' file.txt 

どうすればいいですか?

ベストアンサー1

これを行う方法はいくつかあります。

  1. 真珠

    perl -ane '$F[0]=~s/.{15}/$&\n/g; print ">$F[1]\n$F[0]\n"' file 
    
  2. アッ

    awk '{i=0; printf ">%s\n",$2;
           while(i<=length($1)){
                printf "%s\n", substr($1,i,15);i+=15
            }}' file
    

fold本当にawkで使用したい場合は、これを行うことができます

awk '{printf ">%s\n",$2; system("echo " $1 "| fold -w 15 ") }' file

$()あなたの試みは物ではなく殻であるため失敗しますawk。内部でシステムコマンドを実行するawkにはsystem()$1(シーケンス)の代わりにシェルの実際の文字列(これは$1シェルがそれを評価しようとし、設定されていないため空白を返します)なので、引用符から除外する必要があります$1$1

したがって、この例では

               |-------------------------> closing quotes for the 1st part
               |                    |----> closing quotes for the 2nd part
               v                    v   
system( " echo "  $1  " | fold -w 15")
        - ----    --- - ------------
        |  |       |  |       |----------> the 2nd part
        |  |       |  |------------------> opening quotes for the 2nd part       
        |  |       |---------------------> The awk variable, `$1`, 
        |  |                               outside the quotes.         
        |  |-----------------------------> The 1st part       
        |--------------------------------> opening quotes for the 1st part

おすすめ記事