aac
지정된 파일에서 특정 시퀀스(예:)가 발생하는 횟수를 표시하는 "countmatches"라는 bash 스크립트를 작성하는 것이 과제입니다. 스크립트에는 최소한 두 개의 매개변수가 있어야 하며, 그 중 첫 번째 매개변수는 우리가 제공한 유효한 DNA 문자열을 포함하는 파일의 경로 이름이어야 합니다. 나머지 매개변수는 base a
, c
및 g
임의 순서로 포함된 문자열입니다. 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
줄당이 아닌 파일당 개수가 필요한 경우 CNT
s를 추가하고 해당 섹션에 인쇄하세요 END
.