特定のDNA塩基配列がファイルに表示される回数を探す

特定のDNA塩基配列がファイルに表示される回数を探す

aac指定されたファイルで特定のシーケンス(例:)が発生した回数を示す「countmatches」と呼ばれるbashスクリプトを作成することが課題です。スクリプトには少なくとも2つのパラメータが必要です。そのうちの最初のパラメータは、提供された有効なDNA文字列を含むファイルのパス名でなければなりません。残りのパラメータは、base acおよび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

1行あたりのファイルあたりの数が必要な場合は、CNTsを追加してそのセクションに印刷してくださいEND

関連情報