Использование awk для печати индекса шаблона в файле - PullRequest
0 голосов
/ 07 ноября 2018

Я уже давно сижу на этом:

Я бы хотел найти шаблон в sample.file с помощью awk и напечатать индекс:

>sample
ATGCGAAAAGATGAACGA
GTGACAGACAGACAGACA
GATAAACTGACGATAAAA
...

Допустим, я хочу найти индекс следующего шаблона: "AAAA" (встречается дважды), поэтому результат должен быть 6 и 51.

EDIT:

Мне удалось использовать следующий скрипт:

cat ./sample.fasta |\
awk '{
    s=$0
    o=0
    m="AAAA"
    l=length(m)
    i=index(s,m)
    while (i>0) {
        o+=i
        print o
        s=substr(s,i+l)
        o+=l-1
        i=index(s,m)
    }
}'

Тем не менее, он перезапускает индекс для каждой новой строки, поэтому получается 6 и 15. Я всегда могу объединить все строки в одну строку, но, возможно, есть более элегантный способ.

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

AWK индексы, конечно:

awk '{ l=index($0, "AAAA"); if (l) print l+i; i+=length(); }' dna.txt

6
51

0 голосов
/ 07 ноября 2018

если у вас все в порядке с нулями, это может быть проще.

$ sed 1d file | tr -d '\n' | grep -ob AAAA

5:AAAA
50:AAAA

предполагает, что вы разместили строку заголовка, если не удалите команду sed. Обратите внимание, что это предполагает использование однобайтовых символов, как показано на рисунке. Для расширенных наборов символов это будет не позиция символа, а смещение в байтах.

0 голосов
/ 07 ноября 2018

awk читает файлы построчно, поэтому никогда не будет проблем найти «все» индексы в многострочном файле. Ваша проблема в том, что вы пытаетесь использовать блок BEGIN, который, как следует из его названия, запускается только в начале программы. Кроме того, функция index() принимает два аргумента.

Для ваших примеров данных это должно работать:

awk '/AAAA/{print index($0,"AAAA")+l} NR>1{l+=length}' sample.file

Первый блок кода запускается только при совпадении AAAA, второй выполняется для каждой строки после первой, увеличивая счетчик на длину строки.


Для случая, когда у вас есть несколько совпадений на строку, это должно работать:

awk -v pat=AAAA 'BEGIN{for(n=0;n<length(pat);n++) rep=rep"x"} NR>1{while(i=index($0,pat)){print i+l; sub(pat,rep);} l+=length}' sample.file

Шаблон передается как переменная; Когда программа запускается, текст замены генерируется на основе длины шаблона. Затем каждая строка после первой зацикливается, получая индекс шаблона и заменяя его, чтобы следующая итерация возвращала следующий экземпляр.

Стоит отметить, что оба эти метода будут соответствовать AAAAAA.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...