DNA ファイル内のヌクレオチド塩基文字の数が 3 の倍数であるかどうかを確認しようとしていますが、次のコードでエラーが発生し続けます。
var4=$(wc -c < $1 | bc)
var5=$($var4 % 3)
if [ "$var5" -eq 0 ]; then
ご覧のとおり、上記のコードは完全ではありませんが、問題が発生している部分のみを示しています。
答え1
ヌクレオチドがグループ内の文字を使用してエンコードされていると仮定するとacgtn
、次のコマンドはそのグループの文字以外のすべて (改行やスペースなど) を削除し、残りの文字をカウントします。
ncount=$( tr -d -c 'acgtn' <"$1" | wc -c )
次に、簡単なテストでこの数値を確認できますが、$((...))
ではなくを使用することに注意してください$(...)
。
if [ "$(( ncount % 3 ))" -eq 0 ]; then
echo 'nucleotide count is multiple of 3'
fi
大文字または大文字と小文字を混在して使用する場合は、使用する文字列をtr
適切に拡張してください。
答え2
改行文字以外の文字を 3 つずつ削除するには、次のようにします。
sed 's/...//g' file
結果が空行のみの場合、すべての行に 3 文字の倍数が含まれていました。
入力が 1 行ではなく、他の文字 (改行を含む) が含まれている可能性がある場合は、ACGTN
改行を含むヌクレオチド基本文字 (大文字と想定) 以外のものをすべて削除します。
{ <file tr -cd 'ACGTN'; echo; } | sed 's/...//g'
結果が空(改行のみ)の場合、基本文字の数は 3 の倍数になります。
カウントが 3 の倍数でない場合にスクリプトを停止 (終了) したい場合は、次のようにします。
if [ "$( { <file tr -cd 'ACGTN'; echo; } | sed 's/...//g')" ]; then
echo 'nucleotide count is not multiple of 3'
exit 1
fi
答え3
オプションsed
f=$(sed -E "s/[actgn]{3}//g" file); echo ${#f}
連続する 3 塩基の有効なグループをすべて削除するだけで、最後に長さ 0 の文字列以外のものが残っている場合は問題が発生します。ただし、区切りが 3 塩基の倍数であれば、新しい行が許可されます。
答え4
を使用するとbash
、GNU grep
およびwc
、ただし変数はありません:
(exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) )
...これは真実DNA 文字が 3 の倍数である場合にのみコードを終了します。
これをコード内で使用すると次のようになります。
if (exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) ); then