BASH переводит ДНК файла FASTA в белок. Возможно вставить массив awk?

#linux #bash #shell #awk #sed

#linux #bash #оболочка #awk #sed

Вопрос:

Я новичок в программировании и пытался вставить awk-массив / команду? в скрипт bash для преобразования ДНК в белок и вывода частот белка в файл. В моих бесконечных поисках после многочисленных неудач за последние несколько дней я видел, как многие другие задавали этот вопрос, но, похоже, я не могу собрать воедино кусочки их ответов.

Вероятно, я должен отметить, что это должно быть в BASH. Это для класса и является только частью задания. Я не пытаюсь сделать вид, что прошу кого-то сделать мою домашнюю работу. Честно говоря, у меня совершенно нет идей, и я действительно нуждаюсь в помощи.

Если бы кто-нибудь мог хотя бы объяснить, как вы переходите из командной строки awk [например: awk -f commandtodo.awk filetoread.txt ] чтобы поместить это в сценарий BASH, я бы очень высоко оценил это.

Если у кого-то есть дополнительное время, чтобы объяснить мне это, как будто мне пять лет, вот фрагменты, которые я пытаюсь собрать воедино:

Вот массив / команда awk, которую я пытаюсь использовать:

 # translates DNA to protein
#this one works on command line
BEGIN{c["ATA"]="I"; c["ATC"]="I"; c["ATT"]="I"; c["ATG"]="M";
    c["ACA"]="T"; c["ACC"]="T"; c["ACG"]="T"; c["ACT"]="T";
    c["AAC"]="N"; c["AAT"]="N"; c["AAA"]="K"; c["AAG"]="K";
    c["AGC"]="S"; c["AGT"]="S"; c["AGA"]="R"; c["AGG"]="R";
    c["CTA"]="L"; c["CTC"]="L"; c["CTG"]="L"; c["CTT"]="L";
    c["CCA"]="P"; c["CCC"]="P"; c["CCG"]="P"; c["CCT"]="P";
    c["CAC"]="H"; c["CAT"]="H"; c["CAA"]="Q"; c["CAG"]="Q";
    c["CGA"]="R"; c["CGC"]="R"; c["CGG"]="R"; c["CGT"]="R";
    c["GTA"]="V"; c["GTC"]="V"; c["GTG"]="V"; c["GTT"]="V";
    c["GCA"]="A"; c["GCC"]="A"; c["GCG"]="A"; c["GCT"]="A";
    c["GAC"]="D"; c["GAT"]="D"; c["GAA"]="E"; c["GAG"]="E";
    c["GGA"]="G"; c["GGC"]="G"; c["GGG"]="G"; c["GGT"]="G";
    c["TCA"]="S"; c["TCC"]="S"; c["TCG"]="S"; c["TCT"]="S";
    c["TTC"]="F"; c["TTT"]="F"; c["TTA"]="L"; c["TTG"]="L";
    c["TAC"]="Y"; c["TAT"]="Y"; c["TAA"]="_"; c["TAG"]="_";
    c["TGC"]="C"; c["TGT"]="C"; c["TGA"]="_"; c["TGG"]="W"}
{i=1; p=""}
{do {
  s=substr($0, i, 3)
  printf ("%s ", s)
  {if (c[s]==""){p=p"    "} else {p=p c[s]" "}}
  i=i 3}
while (s!="")}
{printf("n%sn", p)}
 

Вот цикл BASH, в который я пытаюсь вставить это. Это базовый фрейм, который мне дали.

 #!/bin/bash

if [ "$#" -lt 1 ]                                      ## checking if there is an input file
then
    echo "no input file ..."
else
    myFile=$1                                       ## myFile = input file 
    echo "input file name=" $myFile
    numSeq=$(cat $myFile | grep "^>" | wc -l)      ## getting the number of sequences
    cat $myFile | tr -d [:space:] > DNAfile2.txt    ## edit the space out of the sequences
    if [ $numSeq -gt 0 ]
    then
        echo there are $numSeq sequences in $myFile"." These are":"
        nameSeq=$(cat $myFile | grep -o -E "^>w ")
        awk 'BEGIN{RS=">"}{print $1}' < DNAfile2.txt | grep "Header_" > DNAfile3.txt
        for i in $nameSeq                  ## for loop to collect sequence data for translation 
        do
            seqHeader=$(echo $i | tr -d ">")
            echo $seqHeader

            sequenceFile=$(cat DNAfile3.txt | grep $seqHeader | sed -e "s/$seqHeader/>/" | cut -d ">" -f2)
            echo $sequenceFile
            ############
            ## your work happens here
            ############    
        done
    else
        echo "there are no sequence in" $myFile
    fi
fi
 

Любая помощь будет высоко оценена. Спасибо

Комментарии:

1. Также было бы полезно, если бы вы могли сузить область вашего скрипта, в которой возникают ошибки. Кроме того, в вашем скрипте так много лишних пробелов, что его труднее читать.

2. Скрипты (как есть) работают независимо. Когда я пытаюсь вставить массив awk (что я, скорее всего, делаю неправильно), начинают возникать проблемы. У вас есть предложения о том, как собрать их вместе? Спасибо за ваш ответ.

3. Я ни в коем случае не эксперт по awk. Посмотрите, что происходит, когда вы вставляете массив awk в свой скрипт на shellcheck.net . Многие проблемы могут быть решены только этим.

4. «Если бы кто-нибудь мог хотя бы объяснить, как вы переходите из командной строки awk… для ввода скрипта Bash «. Конечно, достаточно просто. echo $seqFile; awk 'BEGIN{....} { ....}' file Вы просто вставляете свой код между ' (одинарные кавычки). Если ваш код содержит одинарные кавычки, вам нужно обойти это. существует несколько методов. (Я не вижу ни одного отдельного вопроса в вашем коде). Не уверен, откуда берутся эти «фрагменты кода», пожалуйста, используйте {} инструмент форматирования в левом верхнем углу окна редактирования выделенного текста для форматирования как код / данные / выходные данные. Удачи.

5. И оболочки имеют максимальный размер для «слова», которое может находиться между ' символами, поэтому, если вы продолжаете расширять свой код, вы придете к тому, что получите загадочные сообщения об ошибках. Ищите информацию о оболочке Here-Documents , они не ограничены по размеру. т.е. awk <<EOS {your code} EOS (закрытие EOS должно быть только в строке закрытия). Если вы поищете здесь [bash] EOS или [bash] EOF`, вы найдете много примеров. Удачи.