Я хочу иметь возможность извлечь две разные последовательности из одной строки - PullRequest
0 голосов
/ 09 октября 2019

Я хочу иметь возможность извлечь две разные последовательности из одной строки.

Например:

atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag

Я хочу создать цикл, в котором программа будет читать с 1-го atg в tag , выведите эту последовательность в файл, а также возьмите вторую atg , прочитанную в tag , выведите эту последовательность в тот же файл.

Вывод Я хочу:

atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag
atg ttg tca aat tca tgg atc tag

Как я могу это сделать?

Спасибо за помощь.

Ответы [ 2 ]

0 голосов
/ 09 октября 2019

Если вам нужно не более 2 последовательностей, вы можете grep внутри оригинала и измененной строки:

s='atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag'
printf "%s\n" "$s" "${s#*atg}" | grep -Eo "atg.*tag"

Если вы хотите извлечь более 2 подстрок, когда они доступны, вам нужен цикл.

s='atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag'
while [ "$s" ]; do
   s=$(grep -Eo "atg.*tag" <<< "$s")
   if [ "$s" ]; then
      echo "$s"
      s="${s#atg}"
   fi
done
0 голосов
/ 09 октября 2019

Не могли бы вы попробовать следующее:

str="atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag"
start="atg"    # start marker of the sequence
end="tag"      # end marker of the sequence

read -r -a ary <<< "$str"
for (( i=0; i<${#ary[@]}; i++ )); do
    if [[ ${ary[$i]} = $start ]]; then
        index_s+=("$i")
    elif [[ ${ary[$i]} = $end ]]; then
        index_e+=("$i")
    fi
done

s=${index_s[0]}; n=$(( ${index_e[0]} - ${index_s[0]} + 1 ))
echo "${ary[@]:$s:$n}" > "result.txt"
s=${index_s[1]}; n=$(( ${index_e[0]} - ${index_s[1]} + 1 ))
echo "${ary[@]:$s:$n}" >> "result.txt"

Результат:

atg ttg tca aat tca tgg atc atg ttg tca aat tca tgg atc tag
atg ttg tca aat tca tgg atc tag

[Как это работает]

  • read -r -a ary <<< "$str" разбивает $str на пробельные символы (IFS) и сохраняет элементы в массиве ary.
  • Затем цикл for перебирает элементы массива для маркеров начала / конца.
  • Если найден стартовый маркер atg, позиция сохраняется в массиве index_s. Наконец, ${index_s[0]} удерживает первую позицию маркера старта, а ${index_s[1]} - вторую (и т. Д.). Та же операция выполняется с маркером конца tag.
  • . В конце концов скрипт выводит два набора срезов массива. Один начинается с первого atg и заканчивается первым tag. Другой начинается со второго atg и заканчивается первым tag.

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

...