aac
指定されたファイルで特定のシーケンス(例:)が発生した回数を示す「countmatches」と呼ばれるbashスクリプトを作成することが課題です。スクリプトには少なくとも2つのパラメータが必要です。そのうちの最初のパラメータは、提供された有効な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
1行あたりのファイルあたりの数が必要な場合は、CNT
sを追加してそのセクションに印刷してくださいEND
。