Сравните две последовательности ДНК

Мне не удалось найти решение для дерева устройств, но я нашел достаточно фрагментов кода, чтобы приложение могло его прочитать. По сути, я просто настроил прерывание на GPIO и использовал clock_gettimeдля измерения периода между фронтами. Это требует большой фильтрации, но я использую ее только для того, чтобы убедиться, что вентилятор работает, так что все в порядке.

-4
10.04.2021, 15:08
2 ответа
read seq1
read seq2
printf '%s\n' "$seq1" "$seq2" |
sed -Ee '
  N;H;p;z;x

  :zip
    #   1  2     3
    s/\n(.)(.*\n)(.)/\1\3\n\2/
    s/\n\n//; # zipping is complete when the two markers collide
  t zip

  :cmp
  s/^([-+]*)(AT|TA|CG|GC)/\1+/;t cmp
  s/[ATCG]{2}/-/;t cmp
'

Выход:

ATGCATGCTATC
TACGTTGCATTG
+++++---++-+

Другой подход, на этот раз с использованием утилиты awk , где мы сжимаем две последовательности символ за символом и с помощью ассоциативного массива h, который предварительно -заполнен соответствующими ключами, чтобы дать + в то время как остальные получают-

awk '
BEGIN {
  OFS = ORS

  split("AT TA CG GC", a)
  for (var in a) h[a[var]]

  seq1 = ARGV[1]; seq2 = ARGV[2]
  len = length(seq1)

  while ( ++pos <= len ) {
    s = substr(seq1, pos, 1) \
        substr(seq2, pos, 1) ;
    res = res ((s in h) ? "+" : "-")
  }

  print seq1, seq2, res
}
' "$seq1" "$seq2"

Мы используем python3 для сравнения последовательностей, хранящихся в строках и заархивированных

python3 -c 'import sys
s,t = sys.argv[1::]
dna = "ATCG"
d = {i+j: "+" for i,j in zip(dna[0::2],dna[1::2])}
print(*[d.get(x+y,d.get(y+x,"-")) for x,y in zip(s,t)],sep="")
' "$seq1" "$seq2"

Perl адаптация приведенного выше примера Python:

printf '%s\n' "$seq1" "$seq2" |
perl -F// -pale '
  my @h = qw(A T C G);
  my %h = (@h, reverse @h);
  my $zip = join q(), map { $F[$a++], $_ } <> =~ /./g;
  $_ = $zip ​=~ s/(.)(.)/qw(- +)[$2 eq $h{$1}]/reg;
'
2
28.04.2021, 22:53

Использование bashиtr:

#!/bin/bash

printf '%s\n%s\n' "$1" "$2"
tr 37124568 '++[-*]' <<<$(( $(tr ATCG 1234 <<<"$1 + $2") ))

Тестирование:

$ bash script ACCTACCATAG AGTACCCGATC
ACCTACCATAG
AGTACCCGATC
-+-+----+++

Скрипт заменяет символы в последовательностях, заданных в командной строке, цифрами таким образом, что при их сложении цифры 3 и 7 в сумме означают +, а все остальные цифры означают -.

Символ изменяется следующим образом:

A --> 1
T --> 2
C --> 3
G --> 4

Это означает, что A+ T— это то же самое, что 1+2, то есть 3. Точно так же 7 получается из 3+4 для Cи G.

Внешний вызов trпреобразует все 3 и 7 в +и все другие возможные цифры в -. Сумма вычисляется с помощью арифметического расширения $((... )), которое выполняет сложение двух чисел, полученных в результате внутреннего вызова tr, который просто меняет буквы на цифры в двух последовательностях.

Проверка ввода не выполняется. Нет проверки на арифметические ошибки,подобно переполнению (, которое, вероятно, произойдет для последовательностей длиннее нескольких пар оснований, если вы не позаботитесь о том, чтобы разбить их, например. по характеру ).

Если вы хотите читать последовательности из стандартного ввода, используйте

#!/bin/bash

read s1
read s2

printf '%s\n%s\n' "$s1" "$s2"
tr 37124568 '++[-*]' <<<$(( $(tr ATCG 1234 <<<"$s1 + $s2") ))
2
28.04.2021, 22:53

Теги

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