2013-11-08 2 views
-2

Добрый день из Испании. Я изучаю AWK, и я знаю, как делать команды из терминала Linux с помощью труб, но я бы хотел писать сценарии AWK. Посмотрим, сможешь ли ты мне помочь.HowTo. Написание сценария awk

У меня есть следующий код:

awk '{if (NR!=1) {printf $0}}' sequence.fasta | 
awk '{sub(/ATG/, "\n&")}{print}' | 
awk 'NR == 2' | awk '{gsub(/.../, "& ")}1' | 
awk '{for (i=1; i<=NF; i++) {printf $i" "; if ($i~/TAA/ || $i~/TAG/ || $i~/TGA/) {exit}}}' | 
fold -w 60 

из файла FASTA, этот сценарий показывает от стартового кодона (ATG) СТОП-кодона (ТАА, TAG или TGA). Файл FASTA имеет следующую структуру:

>sequence.fasta 
GATCCAAAACACATTCTCCCTGGTAGCATGGACAAGCAACATTTTGGGAGAAATGGAGCAAAAAAACATA 
AACTTCACAGTAACAAACATAAACACTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTC 
TCTCTCTCCACACACACACACACTCGCACTCACAGCCTCACAACACAGGTATACATGTTTACTTAGGTCA 
CTCAGAATTGTAAACTGTAAGTGTGCCTTGCAAAGAACCACTGCTCCTTACAGTGAGCAGTGCTTACCTG 
GTGCTTACCTGAAGAAGATATAGCTCCTTAAAGAGTAAATGAATAAATACCTTAAGTAAGTTTGGGAAAC 

Применив код я написал выше, я получаю следующий результат:

ATG GAC AAG CAA CAT TTT GGG AGA AAT GGA GCA AAA AAA CAT AAA 
CTT CAC AGT AAC AAA CAT AAA CAC TCT CTC TCT CTC TCT CTC TCT 
CTC TCT CTC TCT CTC TCT CTC TCT CTC TCT CCA CAC ACA CAC ACA 
CTC GCA CTC ACA GCC TCA CAA CAC AGG TAT ACA TGT TTA CTT AGG 
TCA CTC AGA ATT GTA AAC TGT AAG TGT GCC TTG CAA AGA ACC ACT 
GCT CCT TAC AGT GAG CAG TGC TTA CCT GGT GCT TAC CTG AAG AAG 
ATA TAG 

Итак, мой код сделать это:

Он печатает все последовательности вместе за исключением заголовка. Printf печатает без \ n.

awk '{if (NR!=1) {printf $0}}' sequence.fasta 

Он ищет первый ATG и представляет новую линию.

awk '{sub(/ATG/, "\n&")}{print}' 

Как мы только вводит новую строку при запуске ATG, се выберите линию 2, игнорируя линии 1 (5'-UTR).

awk 'NR == 2' 

Теперь мы создаем кодоны, разделенные пробелом.

awk '{gsub(/.../, "& ")}1' 

Теперь, с петлей, мы ищем кодон STOP. Когда он находит это, цикл останавливается.

awk '{for (i=1; i<=NF; i++) {printf $i" "; if ($i~/TAA/ || $i~/TAG/ || $i~/TGA/) {exit}}}' 

Для лучшего обзора мы исправим ширину 60 символов.

fold -w 60 

Итак, я попытался поставить все вместе в script.awk, но он не работает. Я знаю, что с awk это не так просто, как писать все вместе. Так, пожалуйста, помогите мне с этим, пожалуйста?

+4

Это абсолютно «так же просто, как писать все вместе», но вам нужно знать, что «все это» должно делать. Почему ваш ожидаемый результат начинается с 'ATG GAC', когда первое появление« ATG »на вашем входе сопровождается« AAG », насколько я могу видеть. И не начинайте говорить о fastas и кодонах, или что-то такое, что означает ваш домен - просто расскажите о шаблонах/комбинациях букв/строк в тексте ввода. –

+0

Это был просто пример. Мой выход идет от первого появления ATG до первой остановки кодонов. – user2886545

+3

Когда вы отправляете пример, это помогает нам помочь вам, если мы можем сопоставить ввод с выходом, поэтому, пожалуйста, отредактируйте свой вопрос для ввода сообщения и соответствующего вывода, а не из двух разрозненных наборов. И вы не должны ожидать, что кто-либо из awk-экспертов, читающих это, знает или заботится о том, что такое «кодонов» - просто скажите «Я хочу найти первое вхождение« FOOBAR »' или любую строку или строки, которые вы ищете. –

ответ

2

Похоже, что все, что вы пытаетесь сделать, это пропустить первую строку, а затем распечатать с первого появления «ATG» в вашем файле до первого появления TAA, TGA или TAG в комбинациях из 3 букв и распечатать их рядами по 15 столбцов. Если это так, то это просто так:

$ cat file 
>whatever 
GATCCAAAACACATTCTCCCTGGTAGCATGGACAAGCAACATTTTGGGAGAAATGGAGCAAAAAAACATA 
AACTTCACAGTAACAAACATAAACACTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTC 
TCTCTCTCCACACACACACACACTCGCACTCACAGCCTCACAACACAGGTATACATGTTTACTTAGGTCA 
CTCAGAATTGTAAACTGTAAGTGTGCCTTGCAAAGAACCACTGCTCCTTACAGTGAGCAGTGCTTACCTG 
GTGCTTACCTGAAGAAGATATAGCTCCTTAAAGAGTAAATGAATAAATACCTTAAGTAAGTTTGGGAAAC 
$ 
$ cat tst.awk 
NR>1 { rec = rec $0 } 
END { 
    if (match(rec,/ATG/)) { 
     rec = substr(rec,RSTART) 
     gsub(/.../,"& ",rec) 
     match(rec,/(TAA|TAG|TGA) /) 
     rec = substr(rec,1,RSTART+RLENGTH-2) 
     gsub(/(...){15}/,"&\n",rec) 
     print rec 
    } 
} 
$ 
$ awk -f tst.awk file 
ATG GAC AAG CAA CAT TTT GGG AGA AAT GGA GCA AAA AAA CAT AAA 
CTT CAC AGT AAC AAA CAT AAA CAC TCT CTC TCT CTC TCT CTC TCT 
CTC TCT CTC TCT CTC TCT CTC TCT CTC TCT CCA CAC ACA CAC ACA 
CTC GCA CTC ACA GCC TCA CAA CAC AGG TAT ACA TGT TTA CTT AGG 
TCA CTC AGA ATT GTA AAC TGT AAG TGT GCC TTG CAA AGA ACC ACT 
GCT CCT TAC AGT GAG CAG TGC TTA CCT GGT GCT TAC CTG AAG AAG 
ATA TAG 
$ 
+0

Я очень ценю это. Большое вам спасибо, Эд. – user2886545

+0

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

+0

Как комментарий. Файл FAST имеет последовательность, но последовательность начинается с строки 2. Строка 1 всегда является заголовком, где определена последовательность (имя, код и определение). По этой причине я выполнил 'awk '{if (NR! = 1) {printf $ 0}}' sequence.fasta' с отдельными командами. – user2886545

Смежные вопросы