Подсчет кодонов ДНК в файле ДНК

Подсчет кодонов ДНК в файле ДНК

Я хочу создать скрипт bash, который берет файл dna и проверяет, что в нем нет символов новой строки или пробелов, а затем выводит уникальные кодоны вместе с их количеством раз, когда они встречаются. Я использовал следующий код, но кодон продолжает выдавать мне вывод "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синтаксис с кодом оболочки таким образом, что это никогда не будет работать.

Вместо этого не усложняйте задачу и разбейте свой файл на группы по три символа, отсортируйте их и посчитайте, сколько уникальных символов вы получили:

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

Это будет работать до тех пор, пока входные данные всегда содержат символы, кратные трем, без пробелов и других символов.

решение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

файл2: пространство

aacacgaact ttaacacg

файл3: перенос строки

aacacgaact
ttaacacg

file4: не кратно 3 основаниям

aacacgaactttaacac

Вы получаете

file1
aac 3
ttt 1
acg 2

file2
is broken

file3
is broken

file4
is broken

Если вы просто хотите восстановить файлы и у вас ничего не получается, file4то catваши файлы проходят trс одного конца awkили с другого, как в вашем примере

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

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