начало и конец

начало и конец

У меня есть следующие блоки данных (несколько)

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: >>>>>>>..>>>>.......<<<<.>>>>>.......<<<<<....>>>>>.......<<<<<<<<<<<<.

Для каждого блока мне нужно найти 8-й шаблон в последней строке блока, который начинается с Str. В приведенном выше случае 8-й шаблон — это .......(7 периодов). Это потому, что первый набор >символов составляет один шаблон, второй набор периодов составляет второй шаблон и так далее.

Теперь мне нужно извлечь эти 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: >>>>>>>.>..>>>>>>....<<<<<<<<<<<<.......<<<<<<.>>>>>....<<<<<.>>>>.......<<<<<.<<<<<<<.

решение1

С использованием 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-е такое поле, -чтобы получить начальные и конечные координаты в последовательности.

Второй блок запускается строкой, начинающейся со строки Seq:, и выбирает последовательность из второго поля, разделенного пробелами, используя начальную позицию антикодона и длину антикодона, считанную из последней Type:строки, убедившись, что с каждой стороны есть по паре оснований.

Затем производится вывод.


Следующий sedскрипт использует 8-й «шаблон» из Str:строки для извлечения нужной последовательности, а не числовые позиции антикодона, указанные в 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не является опечаткой).

Это происходит в два прохода.

На первом проходе создаются два новых файла: data.tmpи pass2.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

while pass2.sedsedскрипт, который выполняет постобработку:

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.sedдает data.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

Учитывая это, мы можем извлечь начальный индекс вместе с антикодоном:

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 (оно жестко задает шаблон «nth»):

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

Предположим, что вам нужно проанализировать повторения строки Str:

начало и конец

Поскольку последовательность шаблонов может меняться для каждого блока, нам нужен способ найти 8-й шаблон.

Можно извлечь каждый повторяющийся «шаблон» (из вашего описания)все, что начинается с символа и заканчивается тем же символом) из строки str с помощью (GNU) grep:

$ 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значение empty "".

поля

Если RSкаждый ""блок далее автоматически делится на поля awk. Будучи последним полем ( $NFна языке awk), 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.

Возможно: Вы это имели в виду?

решение4

Работая perlв режиме абзаца -00и проходя по всем абзацам один за другим -n, сначала заполняем переменные type, anticodon, sequence и str, просматривая их свойства в текущем para, то есть $_.

$ 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]

Связанный контент