удалить TAG / TAA / TGA

$ test1="hello"
$ test2="test1"

$ echo "${!test2}"
hello

Из руководства bash:

Если первый символ параметра - восклицательный знак (! ), и параметр не является именем, он вводит уровень переменной косвенности. Bash использует значение переменной, сформированной из оставшейся части параметра в качестве имени переменной; эта переменная затем расширяется, и это значение используется в остальной части подстановки, а не а не значение самого параметра. Это известно как косвенное расширение. Если параметр является ссылкой на имя, это расширение выполняется до имени переменной, на которую ссылается параметр, вместо того, чтобы выполнить косвенное расширение. переменной, на которую ссылается параметр, вместо того, чтобы выполнять полное косвенное расширение. Исключением являются расширения типа ${!prefix*} и ${!name[@]}, описанные ниже. Восклицательный знак должен следовать непосредственно за левой скобкой, чтобы ввести косвенность.

Для второй части вопроса я бы, вероятно, постарался избежать использования фактических переменных shell в шаблоне, а вместо этого использовал бы легко разбираемые заполнители и заменил бы их с помощью инструмента типа sed.

Есть несколько похожих вопросов, включая "Как заменить строки-заполнители в документе содержимым из файла", "Инструмент для создания текстовых файлов из шаблона" и "Как заменить список заполнителей в текстовом файле?" (есть и другие).

1
27.02.2017, 19:02
1 ответ
#!/usr/bin/env perl

use strict;
use warnings;

while ( my $line = <> ) {
    chomp($line);

    if ($line =~ /\d+\s+\d+/) {
        printf("%s\n", $line);
        next;
    }

    my ( $head, $seq ) = split( /\s+/, $line );

    my $newseq;

    while ( $seq =~ /(...)/g ) {
        if ( $1 !~ /tag|taa|tga/ ) {
            $newseq .= $1;
        }
    }

    printf("%s   %s\n", $head, $newseq);
}

Запуск:

$ ./script input.fa >output.fa

Допущения и ограничения:

  1. Файл находится в «последовательном формате», как описано здесь: http://evolution.genetics.washington.edu/phylip/doc/sequence.html
  2. В последовательности нет пробелов.
  3. Полная длина последовательности кратна трем (в противном случае последний неполный кодон будет исключен из вывода).
  4. Последовательность не разбивается на несколько строк.

Режим работы:

  1. Считывается строка.
  2. Если он содержит два целых числа, предположите, что это «строка заголовка», и выведите ее.
  3. Разделить строку пробелами на $ head (первый бит строки) и $ seq (последовательность).
  4. Пройдите последовательность по трем базам за раз.
  5. Если текущие три основания соответствуют стоп-кодону, они не будут помещены в новую последовательность ( $ newseq ), в противном случае они будут.
  6. Вывести бит заголовка строки вместе с новой последовательностью.
  7. Продолжить со следующей строки, если она есть.

Чтобы получить визуальную индикацию найденных стоп-кодонов, измените цикл на

while ( $seq =~ /(...)/g ) {
    if ( $1 !~ /tag|taa|tga/ ) {
        $newseq .= $1;
    }
    else {
        $newseq .= "<STP>";
    }
}
1
27.01.2020, 23:46

Теги

Похожие вопросы