특정 DNA 염기서열이 파일에 나타나는 횟수 찾기

특정 DNA 염기서열이 파일에 나타나는 횟수 찾기

aac지정된 파일에서 특정 시퀀스(예:)가 발생하는 횟수를 표시하는 "countmatches"라는 bash 스크립트를 작성하는 것이 과제입니다. 스크립트에는 최소한 두 개의 매개변수가 있어야 하며, 그 중 첫 번째 매개변수는 우리가 제공한 유효한 DNA 문자열을 포함하는 파일의 경로 이름이어야 합니다. 나머지 매개변수는 base a, cg임의 순서로 포함된 문자열입니다. t각각의 유효한 매개변수 문자열에 대해 파일에서 DNA 문자열을 검색하고 DNA 문자열(즉, 파일)에서 해당 매개변수 문자열이 중복되지 않는 횟수를 계산합니다.

예제 시퀀스 및 출력은 문자열이 aaccgtttgtaaccggaac라는 파일에 있는 경우 dnafile스크립트는 다음과 같이 작동해야 합니다.

$ countmatches dnafile ttt
ttt 1

명령은 이고 countmatches dnafile ttt출력은 이며 ttt 1디스플레이는 ttt한 번 나타납니다.

이것은 내 스크립트입니다.

#!/bin/bash
for /data/biocs/b/student.accounts/cs132/data/dna_textfiles
do
        count=$grep -o '[acgt][acgt][acgt]' /data/biocs/b/student.accounts/cs132/data/dna_textfiles | wc -w
        echo {$/data/biocs/b/student.accounts/cs132/data/dna_textfiles} ${count}
done

이것은 내가 얻는 오류입니다

[Osama.Chaudry07@cslab5 assignment3]$ ./countmatches /data/biocs/b/student.accounts/cs132/data/dna_textfiles aac
./countmatches: line 6: '/data/biocs/b/student.accounts/cs132/data/dna_textfiles': not a valid identifier

답변1

cat dna_textfile 
aaccgtttgtaaccggaac 

#!/bin/bash    
dna_file=/path/to/dna_textfiles
printf "\e[31mNucleotide sequence?:";
read -en 3 userInput
while [[ -z "${userInput}" ]]
do
read -en 3 userInput
done

count=$(grep -o "${userInput}" "${dna_file}" | wc -l)

echo "${userInput}", ${count}

산출:

 ttt, 1

#!/bin/bash
#set first and second arguments (dnafile and base respectively)

dir=$1
base=$2

count=$(grep -o ${base} ${dir} | wc -l)

echo "${base}", "${count}"

산출:

$ ./countmatches dnafile ttt
ttt, 1

@Kusalananda의 댓글에 답장

위의 솔루션이 중요합니다.중복 없음문자열에서 발생 횟수입니다. 예를 들어 문자열 "acacaca"에는 "aca"가 겹치지 않는 2개 항목과 "aca"가 3개 겹치는 경우가 있습니다. 계산을 위해겹치는발생 횟수:

#!/bin/bash
#set first and second arguments (sequence and base respectively)  
sequence=$1
base=$2
diff_sequence_base=$((${#sequence} - ${#base} | bc))

for ((i=0; i <= ${diff_sequence_base}; i++)); do
       [ ${sequence:i:${#base}} = $base ] && ((count++))

done
echo $base, $count


$ ./countmatches acacaca aca
aca, 3


$ ./countmatches aaccgtttttaaccggaac ttt
ttt, 3

답변2

시퀀스 일치 ttt및 일치 수 보고는 쉽습니다.

$ echo 'aaccgtttgtaaccggaac' | grep -o 'ttt' | wc -l

또는 시퀀스가 ​​파일에 있는 경우:

$ echo 'aaccgtttgtaaccggaac'>dnafile
$ grep -o 'ttt' dnafile | wc -l
1

$ grep -o 'aac' dnafile | wc -l
3

따라서 당신이 해야 할 일은 bash 스크립트에 이 아이디어를 작성하는 것뿐입니다.

#!/bin/bash
dnafile=${1-./dnafile}                   # Name of the file to read (arg 1)
shift                                    # Erase arg 1.

for pat; do                              # Process all the other line arguments.
    printf '%s ' "$pat"                  # Print the patern used.
    grep -o "$pat" "$dnafile" | wc -l    # Find the count of matches.
done                                     # done.

chmod u+x countmatches다음과 같이 스크립트를 호출합니다(실행 가능하게 만든 후).

$ ./countmatches dnafile ttt aac ccgtttg ag
ttt 1
aac 3
ccgtttg 1
ag 0

답변3

파일의 행에서 겹치지 않는 염기의 경우, 예:

aaccgtttgtaaccggaac 
acacaca

, 노력하다

awk '{print gsub (base, "&")}' base="ttt" file
1
0

겹치는 경우 다음을 시도하십시오.

awk '{while (0 < T=index ($0, base)) {CNT++; $0 = substr($0, T+1)}; print CNT+0;  T = CNT = 0}' base="aca" file
0
3

줄당이 아닌 파일당 개수가 필요한 경우 CNTs를 추가하고 해당 섹션에 인쇄하세요 END.

관련 정보