두 개의 DNA 서열 비교

두 개의 DNA 서열 비교

ATGCATGC두 개의 DNA 서열이 있습니다TACGTTGC

A비교가 정렬되면 "+"를 제공 T하고 G그렇지 않으면 C"-"를 인쇄 하는 프로그램을 작성하고 싶습니다 .

좋다

ATGCATGC
TACGTTGC
+++++---

누구든지 나를 도와줄 수 있나요?

위의 내용은 예상되는 결과를 제공합니다.

내가 시도한 것은 다음과 같습니다.

#!/bin/bash


declare -a seq1=()
declare -a seq2=()


read -p 'Enter the ncleotide seq (charactor by charactor followe\d by space0) ' -a seq1

read -n1 seq1

read -p 'Enter the ncleotide seq (charactor by charactor followe\d by space0) ' -a seq2

read -n1 seq2

for a in ${seq1[*]} ; do
for b in ${seq2[*]} ; do
if [ $a == A ] || [ $b == T ] ; then
echo -n "+"
elif [ $a == A ] || [ $b == C ] ; then
echo -n " -"
elif [ $a == A ] || [ $b == G ] ; then
echo -n "-"
elif [ $a == T ] || [ $b == A ] ; then
echo -n "+"
elif [ $a == T ] || [ $b == C ] ; then
echo -n "-"
elif [ $a == T ] || [ $b == G ] ; then
echo -n "-"
elif [ $a == C ] || [ $b == G ] ; then
echo -n "+"
elif [ $a == C ] || [ $b == A ] ; then
echo -n "-"
elif [ $a == C ] || [ $b == T ] ; then
echo -n "-"
elif [ $a == G ] || [ $b == C ] ; then
echo -n "+"
elif [ $a == G ] || [ $b == A ] ; then
echo -n "-"
elif [ $a == G ] || [ $b == T ] ; then
echo -n "-"
else  
echo $a $b
fi
done
done

답변1

사용 awk:

awk -v seq1='CATGCATGCTCAT' -v seq2='ATACGTTGCGTTA' '
function sign(s) { cmp=(cmp==""?"":cmp) s }
BEGIN{
    split(seq1, tmp1, ""); split(seq2, tmp2, "");
    for(i in tmp1) {
        if( tmp1[i] == tmp2[i] ){ sign("-"); continue }
        if( (tmp1[i] ~/[AT]/ && tmp2[i] ~/[AT]/) || 
            (tmp1[i] ~/[GC]/ && tmp2[i] ~/[GC]/) ) { sign("+"); continue }
        sign("-")
    }
    print seq1 ORS seq2 ORS cmp
}'

산출:

CATGCATGCTCAT
ATACGTTGCGTTA
-+++++-----++

주석이 포함된 동일한 코드:

awk -v seq1='CATGCATGCTCAT' -v seq2='ATACGTTGCGTTA' '
# set sequences one in seq1 another in seq2

function sign(s) { cmp=(cmp==""?"":cmp) s }
# function to join the the changes on +/- for each pair of chars

BEGIN{
    split(seq1, tmp1, ""); split(seq2, tmp2, "");
    # split each sequences characters into individual arrays

    for(i in tmp1) {
    # loop over keys on one of the arrays (assuming length of both seq will be same)

        if( tmp1[i] == tmp2[i] ){ sign("-"); continue }
        # if both chars were same AA, TT, CC, GG, ..., sign should be "-"

        if( (tmp1[i] ~/[AT]/ && tmp2[i] ~/[AT]/) || 
            (tmp1[i] ~/[GC]/ && tmp2[i] ~/[GC]/) ) { sign("+"); continue }
        # if one was "A" and another was "T" or vice-versa as well as
        # if one was "G" and another was "C" or vice-versa, sign should be "+"

        sign("-")
        # otherwise "-"

    }
    print seq1 ORS seq2 ORS cmp
    # print the last result, first printing the sequences then 
    # the comparison result in 'cmp'
}'

답변2

사용 bashtr:

#!/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과 같습니다. 마찬가지로 C합계의 경우 7은 3+4에서 나옵니다 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") ))

답변3

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
+++++---++-+

이번에는 다른 방법을 이용해서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"

우리는 사용파이썬 3문자열에 저장되고 압축된 시퀀스 비교를 수행합니다.

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"

진주위의 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;
'

관련 정보