Попытка написать сценарий для поиска ORF из 6 разных кадров

 pkg set -A 0 myPackage-1.2.3_4

Или используйте -A 1, чтобы отметить его как автоматический.

Кроме того, pkg query -a "%o %a"перечислит все пакеты и их автоматическую -принадлежность. Или RTFM pkg-queryдля примера того, как перечислить только автоматические или не -автоматические пакеты.

1
14.10.2019, 15:30
3 ответа

Поиск и сопоставление с регулярным выражением можно выполнить с помощьюperl(моего любимого sedне поддерживает необходимое не -жадное регулярное выражение (p )совпадение):

# echo AAAGCATATGCTAGCCCGTATAGCGATACTAGCTATACGATATATATGATCAATGCCCGTATAG | perl -pe 's|(.*?)(ATG.*?TA[AG])(.*?)|\2\n|g'
ATGCTAG
ATGATCAATGCCCGTATAG
AA

где команда perlпечатает запрошенные вами последовательности -и одну последнюю строку с остальной частью строки. Чтобы не усложнять регулярное выражение, его можно легко удалить вручную или с помощьюhead:

echo AAAGCATATGCTAGCCCGTATAGCGATACTAGCTATACGATATATATGATCAATGCCCGTATAGAA | perl -pe 's|(.*?)(ATG.*?TA[AG])(.*?)|\2\n|g' | head -n -1
ATGCTAG
ATGATCAATGCCCGTATAG

Эти echoкоманды показывают правильный результат для вашей последовательности. Если вы хотите прочитать содержимое файла и отправить результат во второй файл, сделайте следующее:

cat original_file | perl -pe 's|(.*?)(ATG.*?TA[AG])(.*?)|\2\n|g' | head -n -1 > new_file

, где original_file— ваш исходный файл, а new_file— целевой файл с отфильтрованными шаблонами.

В приведенном выше примере используется headиз GNU coreutils с синтаксисом «-n -1». Если это не работает для вас, попробуйте

cat original_file | perl -pe 's|(.*?)(ATG.*?TA[AG])(.*?)|\2\n|g' | awk 'NR>1 {print prev} {prev=$0}' > new_file
0
27.01.2020, 23:59

Это возможно в bash, но это действительно не очень хороший инструмент для этого:

#!/bin/bash 

# Read the sequence into the variable $seq
seq=$1

## Check all three frames
for ((frame=0; frame<=3; frame++)); do
  ## Read the sequence in groups of 3
  for ((i=$frame;i<=${#seq};i+=3)); do
    ## The codon: three nucleotides starting from the current position.
    codon=${seq:i:3}
    ## set isORF to 1 if this is an ATG
    if [[ ${seq:i:3} = "ATG" ]]; then 
      isORF=1
    fi
    ## If we're in an ORF
    if [[ $isORF = 1 ]]; then
      ## Add this codon to the ORF's sequence
      ORF="${ORF}${codon}"
      ## Is this a STOP?
      if [[ ${seq:i:3} = "TGA" ||
            ${seq:i:3} = "TAA" ||
            ${seq:i:3} = "TAG" ]];
      then
        ## Print the ORF
        echo "ORF: $ORF"
        ## Set isORF to 0 and empty the ORF variable to repeat the process
        isORF=0
        ORF=""
    fi
  fi
  done
done

Сохраните это как foo.sh, сделайте его исполняемым(chmod a+x foo.sh)и запустите так:

/path/to/foo.sh AAAGCATATGCTAGCCCGTATAGCGATACTAGCTATACGATATATATGATCAATGCCCGTATAG
-1
27.01.2020, 23:59

Вы можете использовать grep, если вы используете версию GNU grep, которая имеет параметр -Pдля perl -совместимых регулярных выражений (PCRE ).

В качестве альтернативы вы можете использовать pcregrep(, также известную как pgrep), автор библиотеки PCRE . В наши дни нет особых причин использовать это, если только вы не используете старую версию GNU grep или не -GNU grep, которая не поддерживает опцию -Pи не может быть обновлена ​​или заменена.

напр. (предполагая, что последовательности находятся в файле с именемinput.txt):

$ grep -oP 'ATG.*?TA[AG]'  input.txt 
ATGCTAG
ATGATCAATGCCCGTATAG

Опция -oуказывает GNU grep выводить только совпадающий текст, а не всю строку, а -Pуказывает использовать perl -совместимые регулярные выражения.

Или, если вы используетеpcregrep:

$ pcregrep -o 'ATG.*?TA[AG]'  input.txt 
ATGCTAG
ATGATCAATGCCCGTATAG

Модификатор non -greedy ?в регулярном выражении(.*?)обеспечивает захват ВСЕХ совпадающих шаблонов, а не только самого длинного. В контексте регулярных выражений «жадный» означает «попытаться найти как можно БОЛЬШЕ» (значение по умолчанию ), а «не-жадный» означает «попытаться найти как можно МЕНЬШЕ».

Наhttps://www.regular-expressions.info/repeat.htmlесть хорошее объяснение этого. Кстати, остальная часть этого сайта — довольно хорошее место для изучения регулярных выражений с множеством руководств и примеров.

Обратите внимание, что большинство библиотек регулярных выражений не реализуют не -жадные совпадения, это расширение Perl, которое также было принято GNU grep. и программы, связанные с PCRE , конечно.

Кстати,Вот как будет выглядеть вывод без модификатора non -greedy:

$ grep -oP 'ATG.*TA[AG]'  input.txt 
ATGCTAGCCCGTATAGCGATACTAGCTATACGATATATATGATCAATGCCCGTATAG
1
27.01.2020, 23:59

Теги

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