Подсчет определенного последовательного символа с его местоположением и длиной

У меня есть файл последовательности и вы хотите подсчитать последовательный символ «N» с его положением вхождения и длиной. Скажем, у меня есть файл с именем mySequence.fasta следующим образом:

 >sequence-1 ATCGCTAGCATNNNNNNNNNNNNNNCTAGCATCATGCNNNNNNATACGCATCACANNNNNNNNNCgcatATCAC 

и ожидаемый результат должен выглядеть следующим образом:

 Position 12 N 14 Position 38 N 6 Position 56 N 9 

Пожалуйста, помогите мне решить это с помощью awk или sed предоставив мое имя файла mySequence.fasta

2 Solutions collect form web for “Подсчет определенного последовательного символа с его местоположением и длиной”

Вы можете сделать это с помощью awk , чей match() который устанавливает переменную RSTART и RLENGTH весьма полезен для этого:

 <mySequence.fasta awk -v C=N '{ i=0 while (match($0, C "+")) { printf "Position %d %s %d\n", i+RSTART, C, RLENGTH i += RSTART+RLENGTH-1 $0 = substr($0, RSTART+RLENGTH) }}' 

Или с perl с использованием массивов @- и @+ которые записывают начало и конец совпадений:

 perl -ne 'printf "Position %d N %d\n", $-[0]+1, $+[0]-$-[0] while /N+/g' 

Еще немного быстрее (по крайней мере, с моей версией perl ) perl подхода, используя оператор ( экспериментальный ) (?{...}) regexp:

 perl -ne '0 while /N(?{$s=pos})N*(?{printf "Position %d N %s\n", $s, pos()-$s+1})/g' 

Еще одно решение awk :

 awk -F '' '{for(i=1;i<=NF;i++){ if($i=="N"&&!sPOS) sPOS=i; if (i==NF &&sPOS && $NF=="N"){LN++}; if($i=="N" &&sPOS && i<NF) {LN++} else if(sPOS) {printf("Position %d N %d\n", sPOS, LN); LN=sPOS=0} } }' infile.txt 

Поскольку вся реализация awk не поддерживает пустую FS ( -F '' ), ниже приведенный сценарий совместим:

 awk -F'N' '{sPOS=0;for(i=2;i<=NF;i++){ if($i==""&&!sPOS) sPOS=(i-1)+length($(i-1)); if($i=="" &&sPOS && NF!=i) {LN++} else if(sPOS) {printf("Position %d N %d\n", sPOS, ++LN); sPOS+=LN+length($i); LN=0} } }' infile.txt 

Пример ввода:

 >sequence-1 ATCGCTAGCATNNNNNNNNNNNNNNCTAGCATCATGCNNNNNNATACGCATCACANNNNNNNNNCgcatATCACNN N AN NNA 

Результат:

 Position 12 N 14 Position 38 N 6 Position 56 N 9 Position 75 N 2 Position 1 N 1 Position 2 N 1 Position 1 N 2 
  • Как заменить определенные строки?
  • как вставить содержимое файла в совпадение с помощью sed - только первое появление
  • grep, awk, sed, печать столбца 2, совпадающая в файле1 и file2 column3
  • Удалить символ авторского права
  • Заменить все, кроме набора символов, в файле с символом новой строки
  • Найдите (и разделите) общие начальные пробелы из файла / трубы
  • Замена строки1 на строку 2 в строках, содержащих строку3 - со строкой1, имеющей несколько раз
  • как добавлять слова из двух файлов слово за словом
  • Невозможно выполнить замену в программе sed
  • grep трубопроводы в sed, заменяя inline; но я хочу, чтобы sed печатал имя файла и менял строку. Является ли это возможным?
  • Sed / Awk - найти строку длиной ровно n символов
  • Interesting Posts

    Разделить имя файла и путь внутри опции -exec команды find

    проблема с подключением к беспроводной сети на FreeBSD 11 на RasPi 2

    Установка внешнего устройства HFS + с помощью truecrypt – только для чтения файловой системы

    diff, где строки в основном одни и те же, но не в порядке?

    Как вводить / выбирать сеанс после выхода из системы без пароля в (Linux Mint) Xfce?

    Влияние изменений GUID и таблиц разделов на данные

    Как удалить конечные пробелы в конце строки в заданных файлах (более одного)?

    DHCP-сервер: предлагает разные адреса подсети для разных интерфейсов

    ERROR: не удалось найти драйвер после смены mysql на mariadb

    отменить по умолчанию ключ от inputrc

    Как включить Wi-Fi с помощью клавиатуры (Dell Inspiron 14r) в suse Linux 11.4

    Есть ли способ загрузить linux непосредственно из MBR?

    Какая комбинация Distro / Virtual Machine является быстрой и стабильной?

    Места хранения FIrefox / Thunderbird

    Linux эффективная команда, чтобы найти, если 32 бит / 64 бит

    Linux и Unix - лучшая ОС в мире.