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

У меня есть файл последовательности и вы хотите подсчитать последовательный символ «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
  • Как создать однородные столбцы из текста, содержащего как вкладки, так и пробелы?
  • Необходимо вставить одинарные кавычки в текстовый файл для использования в качестве SQL-запроса с помощью sed
  • sed заменить на backspace
  • как использовать sed, когда переменная содержит «/» в нем?
  • как переместить заголовок в последний столбец, используя awk или sed
  • sed или awk: удалить строку, которая начинается с числа и заканчивается на rpm
  • Инкрементная арифметика Sed
  • Добавьте строку под каждой строкой, соответствующей шаблону, только если она уже отсутствует
  • использование команды sed для замены имен пробелами
  • Дублируйте и замените шаблон в текстовом файле
  • Вставить текст в определенные строки файла?
  • Linux и Unix - лучшая ОС в мире.