Надеюсь, это простое исправление
Изначально я написал чистый и простой скрипт, который использовал gawk, я использовал его в первую очередь потому, что когда я решал исходную проблему, я нашел то, что я нашел. Теперь мне нужно адаптировать его для использования только awk.
образец файла .fasta:
>gene1
>gene235
ATGCTTAGATTTACAATTCAGAAATTCCTGGTCTATTAACCCTCCTTCACTTTTCACTTTTCCCTAACCCTTCAAAATTTTATATCCAATCTTCTCACCCTCTACAATAATACATTTATTATCCTCTTACTTCAAAATTTTT
>gene335
ATGCTCCTTCTTAATCTAAACCTTCAAAATTTTCCCCCTCACATTTATCCATTATCACCTTCATTTCGGAATCCTTAACTAAATACAATCATCAACCATCTTTTAACATAACTTCTTCAAAATTTTACCAACTTACTATTGCTTCAAAATTTTTCAT
>gene406
ATGTACCACACACCCCCATCTTCCATTTTCCCTTTATTCTCCTCACCTCTACAATCCCCTTAATTCCTCTTCAAAATTTTTGGAGCCCTTAACTTTCAATAACTTCAAAATTTTTCACCATACCAATAATATCCCTCTTCAAAATTTTCCACACTCACCAAC
gawk '/[ACTG]{21,}GG/{print a; print}{a=$0}' file.fasta >"species_precrispr".fasta
то, что, как я знаю, работает, это awk следующее:
awk '/[ACTG]GG/{print a; print}{a=$0}' file.fasta >"species_precrispr".fasta
виновником, следовательно, является интервальное выражение {21,}
Я хочу, чтобы он выполнял поиск по каждой строке, содержащей по крайней мере 21 нуклеотид, оставшийся от моего совпадения "GG".
Может кто поможет?
Изменить:
Спасибо за помощь: есть различные решения, которые сработали. Чтобы ответить на некоторые из комментариев, приведем более c базовый пример начального вывода и достигнутого желаемого эффекта ...
Перед командой awk: cat file1.fasta
>gene1
ATGCCTTAACTTTCAATAACTGG
>gene2
ATGGGTGCCTTAACTTTCAATAACTG
>gene3
ATGTCAAAATTTTTCATTTCAAT
>gene4
ATCCTTTTTTTTGGGTCAAAATTAAA
>gene5
ATGCCTTAACTTTCAATAACTTTTTAAAATTTTTGG
Все следующие коды производили одинаковый желаемый результат:
исходный код
gawk '/[ACTG]{21,}GG/{print a; print}{a=$0}' file1.fasta
небольшая модификация, которая добавляет функцию интервала к исходной версии awk> 3.xx
awk --re-interval'/[ACTG]{21,}GG/{print a; print}{a=$0}' file1.fasta
Позволяет для модификации val и правильного вывода, непроверено, но должно работать с более низкими версиями awk
awk -v usr_count="21" '/gene/{id=$0;next} match($0,/.*GG/){val=substr($0,RSTART,RLENGTH-2);if(gsub(/[ACTG]/,"&",val)>= usr_count){print id ORS $0};id=""}' file1.fasta
awk --re-interval '/^>/ && seq { if (match(seq,"[ACTG]{21,}GG")) print ">" name ORS seq ORS} /^>/{name=$0; seq=""; next} {seq = seq $0 } END { if (match(seq,"[ACTG]{21,}GG")) print ">" name ORS seq ORS }' file1.fasta
Желаемый результат: захватить только имена генов и последовательности последовательностей, которые имеют 21 нуклеотид до соответствия GG
>gene1
ATGCCTTAACTTTCAATAACTGG
>gene5
ATGCCTTAACTTTCAATAACTTTTTAAAATTTTTGG
Наконец, чтобы показать отброшенные строки
>gene2
ATG-GG-TGCCTTAACTTTCAATAACTG # only 3 nt prior to any GG combo
>gene3
ATGTCAAAATTTTTCATTTCAAT # No GG match found
>gene4
ATCCTTTTTTTTGGGTCAAAATTAAA # only 14 nt prior to any GG combo
Надеюсь, это поможет другим!