0

* *編集: わかりましたので、これまでに皆さんのアドバイスを実装してみました。

-空白を避けるために、各変数「$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
4

3 に答える 3

3

シーケンスを小文字で生成しています。あなたのコードは、GCT ではなく gct を grep します。-i スイッチを grep に追加します。試す:

occs=`grep -ioc $codon $1`
于 2013-10-07T21:15:36.143 に答える
0

試す:

occs=`cat $1 | grep -o $codon | wc -l | tr -d ' '`

問題はwc、出力がインデントされるため$occs、先頭にたくさんのスペースがあることです。

于 2013-10-07T21:15:52.697 に答える