#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`, вы найдете много примеров. Удачи.