ファイル内の文字数が 3 で割り切れるかどうかをチェックする

ファイル内の文字数が 3 で割り切れるかどうかをチェックする

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

を使用するとbashGNU grepおよびwc、ただし変数はありません:

(exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) )

...これは真実DNA 文字が 3 の倍数である場合にのみコードを終了します。

これをコード内で使用すると次のようになります。

if (exit $(( $(grep -io '[acgtn]' file | wc -l)%3 )) ); then

関連情報