Bash Script Unix. Сопоставление с образцом - PullRequest
0 голосов
/ 29 октября 2018

Как мне написать скрипт для нескольких строк в одной строке без пробелов:

acgtttgggcccagctctccgccctcacacacaccccggggt

для визуальных целей:

acg ttt ggg ccc agc tct ccg ccc tca cac aca ccc cgg ggt

и будет соответствовать 4-й последовательности из 3 букв, повторенной 2 раза. поэтому в приведенной выше последовательности мы имеем ccc в качестве 4-го следствия. и это повторяется снова после agc tct ccg.

так я должен был бы использовать grep для этого?

1 Ответ

0 голосов
/ 30 октября 2018

Тогда как насчет:

#!/bin/bash

# add a space every three letters
str="acgtttgggcccagctctccgccctcacacacaccccggggt"
result=$(sed -e 's/\(...\)/\1 /g' <<< "$str")
echo $result

# check if the 4th sequence is repeated two times
awk '
{   ref = $4;                       # set the 4th sequence as a reference
    for (i=5; i<=NF; i++)           # iterate from 5th sequence to the end
        if (ref == $i) count++      # count the same one as the reference
    printf "4th sequence \"%s\" repeated %d times.\n", ref, count
}' <<< "$result"

, что дает:

acg ttt ggg ccc agc tct ccg ccc tca cac aca ccc cgg ggt
4th sequence "ccc" repeated 2 times.  

Сценарий состоит из двух частей: 1-й, чтобы разделить строку пробелами, и 2-й, чтобы подсчитать повторение 4-го триплета.

  • Скрипт sed sed -e 's/\(...\)/\1 /g' вставляет пробел после каждых трех букв.
  • Сценарий awk циклически повторяет последовательности, аналогичные четвертому триплету.
  • Если вы просто хотите убедиться, что повторение точно два раза или нет, вы можете изменить скрипт для сравнения count с 2.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...