* *編集: わかりましたので、これまでに皆さんのアドバイスを実装してみました。
-空白を避けるために、各変数「$1」と「$codon」を引用符で囲みました。
-大文字を避けるために -ioc フラグを grep に追加しました。
-tr -d' ' を使用しようとしましたが、-d' ' は無効なオプションであると表示されるため、実行時エラーが発生します。
残念ながら、私はまだ同じ問題を見ています。または、別の問題です。すべてのコドンが 1 回だけ出現することがわかります。これは別の種類の間違いです。
今までありがとうございました。私はまだ新しいアイデアを受け入れています。以下のコードを更新しました。* *
特定のファイル内の (ACGT) のすべての順列をカウントすることになっているこの bash スクリプトがあります。
スクリプトの 1 行で目的の結果が得られず、その理由がわかりません。特に、コマンド プロンプトでまったく同じコード行を入力して、目的の結果を得ることができるためです。
コマンドプロンプトで実行される行は次のとおりです。
cat dnafile | grep -o GCT | wc -l
この行は、正規表現「GCT」がファイル dnafile に何回出現するかを示しています。このコマンドを実行すると、得られる結果は 10 です (これは正確です)。
コード自体では、同じコマンドの修正版を実行します。
cat $1 | grep -o $codon | wc -l
$1 はファイル名、$codon は 3 文字の組み合わせです。プログラム内からこれを実行すると、得られる答えは常に 0 です (これは明らかに正確ではありません)。
私はあなたの立派な紳士の一人が、なぜこれが期待通りに機能しないのかについて、この失われた魂を啓発することを望んでいました.
本当にありがとう!
私のコード:
#!/bin/bash
#countcodons <dnafile> counts occurances of each codon in sequence contained within <dnafile>
if [[ $# != 1 ]]
then echo "Format is: countcodons <dnafile>"
exit
fi
nucleos=(a c g t)
allCods=()
#mix and match nucleotides to create all codons
for x in {0..3}
do
for y in {0..3}
do
for z in {0..3}
do
perm=${nucleos[$x]}${nucleos[$y]}${nucleos[$z]}
allCods=("${allCods[@]}" "$perm")
done
done
done
#for each codon, use grep to count # of occurances in file
len=${#allCods[*]}
for (( n=0; n<len; n++ ))
do
codon=${allCods[$n]}
occs=`cat "$1" | grep -ioc "$codon" | wc -l`
echo "$codon appears: $occs"
# if (( $occs > 0 ))
# then
# echo "$codon : $occs"
# fi
done
exit