DNA 파일에서 DNA 코돈 계산

DNA 파일에서 DNA 코돈 계산

DNA 파일을 가져와 줄 바꿈 문자나 공백 문자가 없는지 확인한 다음 고유 코돈과 발생 횟수를 출력하는 bash 스크립트를 만들고 싶습니다. 다음 코드를 사용했지만 코돈이 계속 "bash-3.2$"라는 출력을 제공합니다. 내 구문이 잘못된 것인지, 왜 적절한 출력을 얻지 못하는 것인지 너무 혼란스럽습니다.

! /bin/bash

for (( pos=1; pos < length - 1; ++pos )); do
    codon = substr($1, $pos, 3)
    tr-d '\n' $1 | awk -f '{print $codon}' | sort | uniq -c
done

예를 들어 dnafile이라는 파일에 aacacgaactttaacacg 패턴이 포함되어 있으면 스크립트는 다음 입력 및 출력을 사용합니다.

 $script dnafile              
 aac 3
 acg 2
 ttt 1

답변1

스크립트의 첫 번째 줄이 새 bash셸을 시작하기 때문에 해당 출력을 얻습니다.

그 줄은 읽어야합니다

#!/bin/bash

( #시작 부분에 주의하세요).

awk그런 다음 절대로 작동하지 않는 방식으로 구문과 셸 코드를 혼합합니다 .

대신, 단순하게 유지하고 파일을 3개의 문자 그룹으로 나누고 정렬한 다음 고유 문자 수를 세어보세요.

$ fold -w 3 dnafile | sort | uniq -c
   3 aac
   2 acg
   1 ttt

이는 입력에 공백이나 다른 문자가 포함되지 않고 항상 3개의 배수가 포함되어 있는 한 작동합니다.

답변2

(echo aacacgaactttaacacg ;echo aacacgaactttaacacg ) |
  perl -ne '# Split input into triplets (A3)
            # use each triplet as key in the hash table count
            #   and increase the value for the key
            map { $count{$_}++ } unpack("(A3)*",$_);
            # When we are at the end of the file
            END{ 
                 # Remove the key "" (which is wrong)
                 delete $count{""};
                 # For each key: Print key, count
                 print map { "$_ $count{$_}\n" } keys %count
            }'

답변3

조금 더 긴 awk버전

awk 'BEGINFILE{print FILENAME; delete codon}
     ENDFILE {
     if (NR!=1 || NF!=1 || length($0)%3!=0){
         print "is broken"}
     else{
         for (i=1; i<=length($0); i+=3) codon[substr($0,i,3)]++}; 
         for (c in codon) print c, codon[c]; 
         print ""}' file*

이 입력의 경우

파일1 : 알았어

aacacgaactttaacacg

file2 : 공간

aacacgaact ttaacacg

file3 : 줄 바꿈

aacacgaact
ttaacacg

file4 : 3개 염기의 배수가 아님

aacacgaactttaacac

당신은 얻는다

file1
aac 3
ttt 1
acg 2

file2
is broken

file3
is broken

file4
is broken

파일을 복구하고 싶지만 파일 의 한쪽 끝 이나 다른 쪽 끝에서 파일을 복구 할 수 없는 file4경우 예와 같이cattrawk

<<< $(cat file[1..3] | tr -d "\n ")

관련 정보