Как заменить буквы в строках в файле fasta с помощью циклов bash? - PullRequest
0 голосов
/ 03 января 2019

Я хочу изменить все n в последовательности на -, но я не знаю, как заставить мой bash-скрипт не изменять n, который отображается в именах последовательностей. У меня нет опыта в sed или regex, чтобы убедиться, что мой bash-скрипт читает только строки, которые не начинаются с >, так как это указывает на заголовок.

Файл примера:

>Name_with_nnn
nnnatgcnnnatttg
>Name2_with_nnn
atgggnnnnGGtnnn

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

Ожидаемый результат:

>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---

Итак, после создания файлов последовательности я попытался продолжить свой сценарий с:

while IFS= read -r line
do
     if [[ $line == ">"* ]]
     then
          echo "Ignoring header line: $line"
     else
          echo "Converting to uppercase and then N-to-gaps"
          # sed or tr?? do call $line or do I call $OUTFILE? so confused..
     fi
done      

Ответы [ 4 ]

0 голосов
/ 03 января 2019

В чистом Bash, вероятно, довольно медленно для больших входов:

while IFS= read -r line; do
    case $line in
        '>'*)
            printf '%s\n' "$line"
            ;;
        *)
            line=${line//n/-}
            printf '%s\n' "${line^^}"
            ;;
    esac
done < infile

При этом используется оператор case с сопоставлением с шаблоном для проверки, начинается ли строка с > или нет; для изменения линий используется расширение параметров . Для расширения ${<i>parameter</i>^^} требуется Bash 4.0 или новее.

0 голосов
/ 03 января 2019

Вы можете использовать это просто gnu sed:

sed '/^>/!{s/n/-/g; s/.*/\U&/;}' file

>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---
0 голосов
/ 03 января 2019

Вы можете решить эту проблему с помощью sed с помощью строки ниже:

sed -i "/^>/! {s/n/-/g; s/\(.*\)/\U\1/g}" text.txt

И ваш вывод будет:

>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---
0 голосов
/ 03 января 2019

Как насчет awk?

awk '/^[^>]/{gsub("n","-");print toupper($0);next;}1' data

Вывод:

>Name_with_nnn
---ATGC---ATTTG
>Name2_with_nnn
ATGGG----GGT---

Однако, sed тоже может это сделать (GNU sed):

sed -E '/^[^>]/{s/n/-/g;s/(.*)/\U\1/g;}' data

Это то же самое, что:

sed -E '/^>/!{s/n/-/g;s/(.*)/\U\1/g;}' data

Если вы хотите изменить место, вы можете добавить -i switch к sed.

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