web-dev-qa-db-ja.com

ファイルからn番目のパターンに対応するサブシーケンスを抽出する

以下のデータブロックがあります(複数)

chr1.trna4 (17188416-17188486)  Length: 71 bp
Type: Gly   Anticodon: CCC at 33-35 (17188448-17188450) Score: 78.3
HMM Sc=56.60    Sec struct Sc=21.70
         *    |    *    |    *    |    *    |    *    |    *    |    *    |
Seq: GCATTGGTGGTTCAGTGGTAGAATTCTCGCCTCCCACGCGGGAGaCCCGGGTTCAATTCCCGGCCAATGCA
Str: >>>>>>>..>>>>.......<<<<.>>>>>.......<<<<<....>>>>>.......<<<<<<<<<<<<.

各ブロックについて、Strで始まるブロックの最後の行で8番目のパターンを見つける必要があります。上記の場合、8番目のパターンは.......(7周期)です。これは、>シンボルの最初のセットが1つのパターンを作成し、2番目のピリオドのセットが2番目のパターンを作成する、というように続きます。

次に、これらの7文字を、パターン行のすぐ上のSeq行から抽出する必要があります。例では、これはサブシーケンスCTCCCACに対応しています。

出力はSeq is CTCCCAC and Anticodon: CCCである必要があります

これはbashまたは任意のシェルで可能ですか?

データブロックのその他の例

chr19.trna11 (4724719-4724647)  Length: 73 bp
Type: Val   Anticodon: CAC at 34-36 (4724686-4724684)   Score: 79.2
HMM Sc=49.10    Sec struct Sc=30.10
         *    |    *    |    *    |    *    |    *    |    *    |    *    |  
Seq: GTTTCCGTAGTGTAGCGGTtATCACATTCGCCTCACACGCGAAAGGtCCCCGGTTCGATCCCGGGCGGAAACA
Str: >>>>>>>..>>>..........<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.


chr19.trna12 (1383433-1383361)  Length: 73 bp
Type: Phe   Anticodon: GAA at 34-36 (1383400-1383398)   Score: 88.9
HMM Sc=68.40    Sec struct Sc=20.50
         *    |    *    |    *    |    *    |    *    |    *    |    *    |  
Seq: GCCGAAATAGCTCAGTTGGGAGAGCGTTAGACTGAAGATCTAAAGGtCCCTGGTTCGATCCCGGGTTTCGGCA
Str: >>>>>>>..>>>>........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.


chr21.trna1 (18827177-18827107) Length: 71 bp
Type: Gly   Anticodon: GCC at 33-35 (18827145-18827143) Score: 80.9
HMM Sc=60.10    Sec struct Sc=20.80
         *    |    *    |    *    |    *    |    *    |    *    |    *    |
Seq: GCATGGGTGGTTCAGTGGTAGAATTCTCGCCTGCCACGCGGGAGGCCCGGGTTCGATTCCCGGCCCATGCA
Str: >>>>>>>..>>>>.......<<<<.>>>>>.......<<<<<....>>>>>.......<<<<<<<<<<<<.



chrX.trna4 (18693101-18693029)  Length: 73 bp
Type: Val   Anticodon: TAC at 34-36 (18693068-18693066) Score: 82.9
HMM Sc=54.70    Sec struct Sc=28.20
         *    |    *    |    *    |    *    |    *    |    *    |    *    |  
Seq: GGTTCCATAGTGTAGTGGTtATCACGTCTGCTTTACACGCAGAAGGtCCTGGGTTCGAGCCCCAGTGGAACCA
Str: >>>>>>>..>>>..........<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.


chrX.trna6 (3833344-3833271)    Length: 74 bp
Type: Ile   Anticodon: GAT at 35-37 (3833310-3833308)   Score: 75.5
HMM Sc=50.20    Sec struct Sc=25.30
         *    |    *    |    *    |    *    |    *    |    *    |    *    |   
Seq: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA
Str: >>>>>>>..>>>>.........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.


chrX.trna8 (3794915-3794842)    Length: 74 bp
Type: Ile   Anticodon: GAT at 35-37 (3794881-3794879)   Score: 75.5
HMM Sc=50.20    Sec struct Sc=25.30
         *    |    *    |    *    |    *    |    *    |    *    |    *    |   
Seq: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA
Str: >>>>>>>..>>>>.........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.



chrX.trna10 (3756491-3756418)   Length: 74 bp
Type: Ile   Anticodon: GAT at 35-37 (3756457-3756455)   Score: 75.5
HMM Sc=50.20    Sec struct Sc=25.30
         *    |    *    |    *    |    *    |    *    |    *    |    *    |   
Seq: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA
Str: >>>>>>>..>>>>.........<<<<.>>>>>.......<<<<<.....>>>>>.......<<<<<<<<<<<<.

chr19.trna8 (45981945-45981859) Length: 87 bp
Type: SeC   Anticodon: TCA at 36-38 (45981910-45981908) Score: 146.9
HMM Sc=0.00 Sec struct Sc=0.00
         *    |    *    |    *    |    *    |    *    |    *    |    *    |    *    |    * 
Seq: GCCCGGATGATCCTCAGTGGTCTGGGGTGCAGGCTTCAAACCTGTAGCTGTCTAGCGACAGAGTGGTTCAATTCCACCTTTCGGGCG
Str: >>>>>>>.>..>>>>>>....<<<<<<<<<<<<.......<<<<<<.>>>>>....<<<<<.>>>>.......<<<<<.<<<<<<<.
7
MO12

アンチコドンとともに開始インデックスを抽出できるとすると、

len=7
prior=2

while IFS= read  -r line; do
    if [[ $line =~ Anticodon:" "([[:alpha:]]+)" at "([0-9]+) ]]; then
        anticodon=${BASH_REMATCH[1]}
        start=$(( BASH_REMATCH[2] - 1))  # string indexing is zero-based
    Elif [[ $line == "Seq: "* ]]; then
        seq=${line#Seq: }
        printf "Seq: %s, Anticodon: %s\n" "${seq:start-prior:len}" "$anticodon"
    fi
done < file

"Str:"行を毎回解析するより複雑なソリューションですが、長さを7にハードコードしません( "n番目"のパターンをハードコードします)。

8thSeq() {
    local seq=$1 str=$2
    local last=${str:0:1}
    local nth=8 n=1 start

    for (( i=1; i < ${#str}; i++)); do
        if [[ "${str:i:1}" != "$last" ]]; then
            ((n++))
            if ((n == nth)); then
                start=$i
            Elif ((n == nth+1)); then
                echo "${seq:start:i-start}"
                break
            fi
        fi
        last=${str:i:1}
    done
}

while IFS= read  -r line; do
    if [[ $line =~ Anticodon:" "([[:alpha:]]+) ]]; then
        anticodon=${BASH_REMATCH[1]}
    Elif [[ $line == "Seq: "* ]]; then
        seq=${line#Seq: }
    Elif [[ $line == "Str: "* ]]; then
        str=${line#Str: }
        printf "Seq: %s, Anticodon: %s\n" "$(8thSeq "$seq" "$str")" "$anticodon"
    fi
done < file

「より多くの」データを使用して、両方のソリューションが出力します

Seq: CTCACAC, Anticodon: CAC
Seq: CTGAAGA, Anticodon: GAA
Seq: CTGCCAC, Anticodon: GCC
Seq: TTTACAC, Anticodon: TAC
Seq: CTGATAA, Anticodon: GAT
Seq: CTGATAA, Anticodon: GAT
Seq: CTGATAA, Anticodon: GAT
Seq: CTTCAAA, Anticodon: TCA
3
glenn jackman

awkの使用:

$ awk -f script.awk file
Sequence: CTCACAC, Anticodon: CAC, Type: Val
Sequence: CTGAAGA, Anticodon: GAA, Type: Phe
Sequence: CTGCCAC, Anticodon: GCC, Type: Gly
Sequence: TTTACAC, Anticodon: TAC, Type: Val
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTTCAAA, Anticodon: TCA, Type: SeC

ここで、script.awkは次のawkプログラムです。

/^Type:/ {
        type = $2
        anticodon = $4
        split($6, pos, "-")
}

/^Seq:/ {
        seq = substr($2, pos[1]-2, length(anticodon) + 4)
        # or: seq = substr($2, pos[1]-2, pos[2]-pos[1]+5)
        printf "Sequence: %s, Anticodon: %s, Type: %s\n", seq, anticodon, type
}

最初のブロックは、文字列Type:で始まる任意の行によってトリガーされ、2番目と4番目の空白区切りフィールドからタイプとアンチコドンシーケンスを取り出し、-でそのような6番目のフィールドを分割して、シーケンスの開始座標と終了座標。

2番目のブロックは、文字列Seq:で始まる行によってトリガーされ、アンチコドンの開始位置と最新のType:から読み取られたアンチコドンの長さを使用して、2番目の空白区切りフィールドからシーケンスを取り出します。行、どちらかの側でいくつかの塩基対を取得することを確認します。

その後、出力が生成されます。


次のsedスクリプトは、Str:行の8番目の「パターン」を使用して、Type:行で指定されたアンチコドンの数値位置ではなく、必要なシーケンスを抽出します。

/^Type:[[:blank:]]*/ {
        s/.*Type: \([^[:blank:]]*\)[[:blank:]]*Anticodon: \([^[:blank:]]*\).*/ Anticodon: \2, Type: \1/
        h
}

/^Seq:[[:blank:]]*/ {
        s//Sequence: /
        G
        y/\n/,/
        w data.tmp
}

/^Str:[[:blank:]]*/ {
        s///
        s,\(\(\([<>.]\)\3*\)\{7\}\)\(\([<>.]\)\5*\).*,s/: \1\\(\4\\)[^\,]*/: \\1/;n,
        y/<>/../
        w pass2.sed
}

d

(末尾のdはタイプミスではありません)。

これは2つのパスで行われます。

最初のパスでは、2つの新しいファイルdata.tmppass2.sedが作成されます。

$ sed -f script.sed file

(これからのターミナル出力はありません)

指定されたデータの場合、data.tmpは次のようになります

Sequence: GTTTCCGTAGTGTAGCGGTtATCACATTCGCCTCACACGCGAAAGGtCCCCGGTTCGATCCCGGGCGGAAACA, Anticodon: CAC, Type: Val
Sequence: GCCGAAATAGCTCAGTTGGGAGAGCGTTAGACTGAAGATCTAAAGGtCCCTGGTTCGATCCCGGGTTTCGGCA, Anticodon: GAA, Type: Phe
Sequence: GCATGGGTGGTTCAGTGGTAGAATTCTCGCCTGCCACGCGGGAGGCCCGGGTTCGATTCCCGGCCCATGCA, Anticodon: GCC, Type: Gly
Sequence: GGTTCCATAGTGTAGTGGTtATCACGTCTGCTTTACACGCAGAAGGtCCTGGGTTCGAGCCCCAGTGGAACCA, Anticodon: TAC, Type: Val
Sequence: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA, Anticodon: GAT, Type: Ile
Sequence: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA, Anticodon: GAT, Type: Ile
Sequence: GGCCGGTTAGCTCAGTTGGTaAGAGCGTGGTGCTGATAACACCAAGGtCGCGGGCTCGACTCCCGCACCGGCCA, Anticodon: GAT, Type: Ile
Sequence: GCCCGGATGATCCTCAGTGGTCTGGGGTGCAGGCTTCAAACCTGTAGCTGTCTAGCGACAGAGTGGTTCAATTCCACCTTTCGGGCG, Anticodon: TCA, Type: SeC

一方、pass2.sedは、これを後処理するsedスクリプトです。

s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ..............................\(.......\)[^,]*/: \1/;n
s/: ...............................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: ................................\(.......\)[^,]*/: \1/;n
s/: .................................\(.......\)[^,]*/: \1/;n

pass2.seddata.sedに適用すると、最終結果が得られます。

$ sed -f pass2.sed data.tmp
Sequence: CTCACAC, Anticodon: CAC, Type: Val
Sequence: CTGAAGA, Anticodon: GAA, Type: Phe
Sequence: CTGCCAC, Anticodon: GCC, Type: Gly
Sequence: TTTACAC, Anticodon: TAC, Type: Val
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTGATAA, Anticodon: GAT, Type: Ile
Sequence: CTTCAAA, Anticodon: TCA, Type: SeC

注:2番目のステップがvery大規模なデータセットでどのように実行されるかはわかりません。

5
Kusalananda

Str文字列の繰り返しを解析する必要があると仮定します。

始まりと終わり

パターンのシーケンスはブロックごとに変わる可能性があるため、8番目のパターンを見つける方法が必要です。

(GNU)grepを使用して、繰り返される「パターン」(説明から文字で始まり、同じ文字で終わるもの)をstrから抽出することができます。

$ str='>>>>>>>..>>>>.......<<<<.>>>>>.......<<<<<....>>>>>.......<<<<<<<<<<<<.'

$ grep -Eo '(.)\1+' <<<"$str"
>>>>>>>
..
>>>>
.......
<<<<
>>>>>
.......
<<<<<
....
>>>>>
.......
<<<<<<<<<<<<

したがって、(シェルを使用した)8パターンの開始と長さは次のようになります。

pattern=8
splitstr=( $(grep -Eo '(.)\1+' <<<"$str") )
for((i=1;i<=pattern-2;i++)); do
    start=$((start+${#splistr[i]}))
done
len=${splitstr[pattern-1]}

すべてのパターン(8回以上の繰り返し)。

または、短く、開始と終了:

start=$(echo "$str" | grep -Eo '^((.)\2+|.){7}'); start=${#start}
  end=$(echo "$str" | grep -Eo '^((.)\2+|.){8}');   end=${#end}

ブロック

AWKの場合:RSを空の""に設定することで、ファイルをブロック(空の行で区切られた行)に分割することができます(簡単です)。

田畑

RS""の場合、各ブロックはawkによってさらにフィールドに自動的に分割されます。最後のフィールド(awkの用語では$NF)であるため、繰り返される文字を含むstr。

したがって、awkで:

$ awk -vRS="" '{str=$NF; pat=8
cmd1="echo \"" str "\" | grep -Eo '\''^((.)\\2+|.){" pat-1 "}'\''";
cmd2="echo \"" str "\" | grep -Eo '\''^((.)\\2+|.){" pat   "}'\''";
cmd1 | getline start ; close(cmd1) ; start=length(start)
cmd2 | getline end   ; close(cmd2) ;   end=length(end)
print "Start:",start,"End:",end,"Sequence:",substr($(NF-2),start,end-start),"Anticodon:",$9,"Type:",$7
}' biopattern.txt


Start: 30 End: 37 Sequence: CCTCCCA Anticodon: CCC Type: Gly
Start: 31 End: 38 Sequence: CCTCACA Anticodon: CAC Type: Val
Start: 31 End: 38 Sequence: ACTGAAG Anticodon: GAA Type: Phe
Start: 30 End: 37 Sequence: CCTGCCA Anticodon: GCC Type: Gly
Start: 31 End: 38 Sequence: CTTTACA Anticodon: TAC Type: Val
Start: 32 End: 39 Sequence: GCTGATA Anticodon: GAT Type: Ile
Start: 32 End: 39 Sequence: GCTGATA Anticodon: GAT Type: Ile
Start: 32 End: 39 Sequence: GCTGATA Anticodon: GAT Type: Ile
Start: 33 End: 40 Sequence: GCTTCAA Anticodon: TCA Type: SeC

atの後の数字に基づく他の回答の結果とは異なります。

たぶん:これはあなたが意図したことですか?

2
Isaac

これは、元の質問で要求されたように、実際にこれらの>>.......<<を使用して目的のシーケンスを見つける方法です。 このショートカット が見つかる前に、私はそれに取り組み始めました。 sedを使用した楽しい演習であることが判明しました(ただし、このアプローチは最適とはほど遠い場合があります)。 sedがこれを実行できる例として、ここに投稿します。

<data sed -E '
/^Type:|^Seq:|^Str:/ ! d
/^Type:/ {
   s/.*(Anticodon: [CGAT]*).*/\1/
   p; d
   }
/^Seq:/ {
   s/[^CGATcgat]*([CGATcgat]*).*/-\1-/
   h; d
   }
/^Str:/ {
   s/[^><\.]*([><\.]*).*/\1/
   s/([^>])(>)/\1X\2/g
   s/([^<])(<)/\1X\2/g
   s/([^.])(\.)/\1X\2/g
   s/X./X/g
   s/./X/
   s/((X[^X]*){7})X/\1M/

   : deleting
   x; s/.//
   t forget
   : forget
   x; s/^[^M]//
   t deleting

   s/M//

   : moving
   x; s/(.)(.*)/\2\1/
   t forget2
   : forget2
   x; s/^[^X]//
   t moving

   g; s/.*-//
   }
' | sed -E '
/^Anticodon:/ { h; d}
/^Anticodon:/ ! {
   s/^/Seq: /
   s/$/, /
   G
   s/\n//
   }
'

それはこのように動作します:

  1. 最初のsed

    • Type:Seq:、またはStr:で始まらない行は削除されます。
    • Type:で始まる行の場合、Anticodon:情報が抽出されて出力されます。
    • Seq:で始まる行の場合、CGAT…のような便利な文字列が抽出され、-文字が埋め込まれます(後で役立つでしょう)。結果はホールドスペースに保存されます。
    • Str::で始まる行の場合
      • >>...<<…の有用な文字列が抽出されます。
      • Xは、シーケンスが変更されるたびに挿入されます。連続する文字は削除されます。 Xは最初の文字を置き換えます。結果では、すべての「パターン」の最初の文字の代わりにXがあります。
      • 8番目のXMに置き換えられます。
      • deletingループは、2つの行を切り替え、Mが見つかるまで先頭の文字を1つずつ削除します。 Mが検出された場合、他の文字列はすでに1回過剰に削減されています。これを補うために、先行する-が以前に追加されました。
      • movingループは、2つの行の間も切り替えます。 CGAT文字を1つずつ最後に移動するため、末尾の-の後にポップアップします。同じループは、Xが検出されるまで、「パターン」行から文字を1つずつ削除します。以前のMと同様に、Xが検出されたとき、もう一方の文字列はすでに1回余分にシフトされています。これを補うために、ループの外のコマンド(s/M//)でMが削除されました。
      • 目的の文字列は、ホールドスペースの-(以前は-でした)の後ろにあります。それをパターンスペースにコピーし、-までをすべて削除します。結果が出力されます。
  2. 2番目のsed

    • データを後処理するためにあります。ラベルを追加し、フォーマットし、レコードごとに1行を組み立てます。
2

段落モード-00Perlを操作し、すべての段落を1つずつループ-nします。最初に、現在のパラ、別名$_のプロパティを確認して、タイプ、アンチコドン、シーケンス、およびstr変数を入力します。

$ Perl -n00e '
   my($type, $anticodon, $seq, $str) = 
      / (?= .*\nType:      \h+ (\S+)  )
        (?= .*\hAnticodon: \h+ (\S+)  )
        (?= .*\nSeq:       \h+ (\S+)$ )
        (?= .*\nStr:       \h+ (\S+)$ )
      /xms;
   $str =~ /^((.)\2*){7}((.)\4*)/g;
   my($pos_codon, $len_codon) = (pos($str), length($3));
   my $codon = substr($seq, $pos_codon-$len_codon, $len_codon);
   print "Codon:[$codon] Anticodon:[$anticodon] Type:[$type]\n";
' file

結果:

Codon:[CTCACAC] Anticodon:[CAC] Type:[Val]
Codon:[CTGAAGA] Anticodon:[GAA] Type:[Phe]
Codon:[CTGCCAC] Anticodon:[GCC] Type:[Gly]
Codon:[TTTACAC] Anticodon:[TAC] Type:[Val]
Codon:[CTGATAA] Anticodon:[GAT] Type:[Ile]
Codon:[CTGATAA] Anticodon:[GAT] Type:[Ile]
Codon:[CTGATAA] Anticodon:[GAT] Type:[Ile]
Codon:[CTTCAAA] Anticodon:[TCA] Type:[SeC]
1
Rakesh Sharma

私の2セント

while IFS= read -r line; do
  [[ "$(echo $line | grep "Type:")" ]] && codon="$(echo $line | cut -d' ' -f4)" && start="$(echo $line | cut -d' ' -f6)" && type="$(echo $line | cut -d' ' -f2)" && continue
  [[ "$(echo $line | grep "Seq:")" ]] && seq="${line##Seq: }" && continue
  if [[ -n "$seq" && -n "$codon" ]]; then 
    pos="${start%-*}" && pos="$((${pos}-3))"
    echo Seq: "${seq:$pos:7}" Codon: "$codon" Type: "$type"
    seq=
    codon=
    continue
  fi
done < file

出力:

Seq: CTCACAC Codon: CAC Type: Val
Seq: CTGAAGA Codon: GAA Type: Phe
Seq: CTGCCAC Codon: GCC Type: Gly
Seq: TTTACAC Codon: TAC Type: Val
Seq: CTGATAA Codon: GAT Type: Ile
Seq: CTGATAA Codon: GAT Type: Ile
Seq: CTGATAA Codon: GAT Type: Ile
Seq: CTTCAAA Codon: TCA Type: SeC

「タイプ」で始まる行を見つけ、「タイプ」、「コドン」、「位置(33-35から33だけ)」を抽出します。

[[ "$(echo $line | grep "Type:")" ]] && codon="$(echo $line | cut -d' ' -f4)" && start="$(echo $line | cut -d' ' -f6)" && type="$(echo $line | cut -d' ' -f2)" && continue

"Seq:"で始まる行を取得して、dnaシーケンスを抽出します。

[[ "$(echo $line | grep "Seq:")" ]] && seq="${line##Seq: }" && continue

$ seqと$ codonの両方の変数が設定されている場合は、結果を出力し、変数の設定を解除してから続行します。

if [[ -n $seq && -n $codon ]]; then 
  pos="${start%-*}" && pos="$((${pos}-3))"
  echo Seq: ${seq:$pos:7} Codon: $codon Type: $type
  seq=
  codon=       
  continue
fi
0

1つのアプローチは、段落モードでPerlを使用して、パラを改行に分割することです。コルドンの位置と長さを決定するために使用するパラの最後の行。次にこれらの数値を使用して、直前の行からデータを取得します。

$ Perl -F\\n -l -00 -nae '
    $F[-1] =~ /^Str:\s+((.)\2*){7}((.)\4*)/g;
    my $c = substr($F[-2],pos($F[-1])-length($3),length($3));
    my $a = substr($c, 2, 3);
    print "seq:$c anti:$a";
' file.gene

seq:CTCCCAC anti:CCC

簡単な説明:

Each record is a paragraph. Then that 

レコードは改行で分割され、結果の断片はゼロインデックス配列@Fに格納されます。次に、最後の要素$ F [-1]が繰り返されるシーケンスについてスキャンされます。

((.)\1*) is a regex for one set if 

連続した文字。ブレース{7}をこのn uに適用して、7つのシーケンスを取得します。次は8日で、私たちが望むものです。

0
Rakesh Sharma

次に、Type:ショートカットに依存しないawkスクリプトを示します。

function getpos( str, seqndx )
{
   ndx = 1
   i = 1
   strlen = length($tr)

   split(str, chars, "")
   mchar = chars[1]

   for (; i <= strlen; i++) {
       if (mchar != chars[i])  {
           mchar = chars[i]
           if (++ndx == seqndx)
               break
       }
   }

   seqstart = i
   for (; i <= strlen; i++) {
       if (mchar != chars[i])
           break
   }

   return seqstart " " --i
}

/^Type:/ {
    anticodon = $4
}

/^Seq:/ {
    seqstr = $2
}

/^Str:/ {
    posstr = getpos( $2, 8 )
    split(posstr, pos)
    seq = substr(seqstr, pos[1], pos[2] - pos[1] + 1)
    printf "Sequence: %s, Anticodon: %s\n", seq, anticodon
}

このスクリプトによって生成される出力は次のとおりです。

$ awk -f script.awk infile
Sequence: CTCACAC, Anticodon: CAC
Sequence: CTGAAGA, Anticodon: GAA
Sequence: CTGCCAC, Anticodon: GCC
Sequence: TTTACAC, Anticodon: TAC
Sequence: CTGATAA, Anticodon: GAT
Sequence: CTGATAA, Anticodon: GAT
Sequence: CTGATAA, Anticodon: GAT
Sequence: CTTCAAA, Anticodon: TCA
$
0
fpmurphy