Проверка, делится ли количество символов в файле на 3

Проверка, делится ли количество символов в файле на 3

Я пытаюсь проверить, кратно ли количество символов нуклеотидных оснований в моем файле ДНК 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

Чтобы удалить все символы, не являющиеся символами новой строки, группами по три, мы можем сделать следующее:

sed 's/...//g' file

Если результатом являются только пустые строки, все строки содержат символы, кратные трем.

Если входные данные не являются одной строкой и могут содержать другие символы (включая символы новой строки), то удалите все, что не является символами нуклеотидных оснований (предполагается, что они заглавные 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 оснований, и если в конце останется что-то, кроме строки нулевой длины, то у вас возникнет проблема... хотя это позволит создавать новые строки при условии, что разрыв будет кратен 3 основаниям.

решение4

С использованием bash,ГНУ grepи wc, но без переменных:

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

...который возвращаетистинныйкод выхода только в том случае, если количество символов ДНК кратно трем.

Использование этого в коде может выглядеть так:

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

Связанный контент