파일의 문자 수가 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

세 개로 ​​구성된 그룹에서 개행이 아닌 모든 문자를 제거하려면 다음을 수행할 수 있습니다.

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개 염기의 연속된 세트를 모두 제거하십시오. 끝에 길이가 0인 문자열 이외의 것이 남아 있으면 문제가 발생하게 됩니다... 단, 끊김이 3개 염기의 배수인 경우 새 줄이 허용됩니다. .

답변4

사용 bash,암소 비슷한 일종의 영양 grepwc, 변수는 없습니다.

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

...그것은진짜DNA 문자가 3의 배수인 경우에만 종료 코드입니다.

코드에서 이것을 사용하는 것은 다음과 같습니다:

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

관련 정보