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
사용 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과 같습니다. 마찬가지로 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;
'