Intereting Posts
Создать гостевую учетную запись с ограниченным доступом к приложениям обновления не могут быть установлены из-за слишком маленького дискового пространства в / boot Найти идентификатор устройства для раздела в Solaris 11? что является правильной формой для «tex file.tex | dvips | ps2pdf»? скрипт bash для массового изменения размера с помощью Imagemagick В чем разница между ошибкой «не найденной» и ошибкой «команда не найдена» – это то же самое? Почему Vim отступал код неправильно? Есть ли ограничение на длину строки в конфигурационных файлах PAM? Как отправить AT-команды на последовательный интерфейс в Yocto Linux? Последние версии всех приложений в Ubuntu 12.10 Использование DD для копирования только половины (части) съемного устройства Драйверы NVIDIA в Fedora 25 Я застрял в следующем шаге по настройке двойной загрузки для Windows 7 и Arch Linux «Открыть с помощью» в режиме «Виртуальный бокс» Сортировка строк по количеству слов на строку

Количество отсчетов подстроки в строке

У меня есть файл, который содержит последовательность генов, такую ​​как:

ATGTGGATGGTGGGTTACAATGAAGGTGGTGAGTTCAACATGGCTGATTATCCATTCAGTGGAAGGAAACTAAGGCCTCTCATTCCAAGACCAGTCCCAGTCCCTACTACTTCTCCTAACAGCACTTCAACTATAACTCCTTCCTTAAACCGCATTCATGGTGGCAATGATTTATTTTCACAATATCATCACAATCTGCAGCAGCAAGCATCAGTAGGAGATCATAGCAAGAGATCAGAGTTGAATAATAATAATAATCCATCTGCAGCAGTTGTGGTGAGTTCAAGATGGAATCCAACACCAGAACAGTTAAGAGCACTGGAAGAATTGTATAGAAGAGGAACAAGAACACCTTCTGCTGAGCAAATCCAACAAATAACTGCCCAGCTTAGAAAATTTGGAAAAATTGAAGGCAAAAATGTTTTCTATTGGTTTCAGAATCACAAAGCCAGAGAAAGGCAAAAACGACGGCGTCAAATGGAATCAGCAGCTGCTGAGTTTGATTCTGCTATTGAAAAGAAAGACTTAGGCGCAAGTAGG ACAGTGTTTGAAGTTGAACACACTAAAAACTGGCTACCATCTACAAATTCCAGTACCAGTACTCTTCATCTTGCAGAGGAATCTGTTTCAATTCAAAGGTCAGCAGCAGCAAAAGCAGATGGATGGCTCCAATTCGATGAAGCAGAATTACAGCAAAGAAGAAACTTTATGGAAAGGAATGCCACGTGGCATATGATGCAGTTAACTTCTTCTTGTCCTACAGCTAGCATGTCCACCACAACCACAGTAACAACTAGACTTATGGACCCAAAACTCATCAAGACCCATGAACTCAACTTATTCATTTCACCTCACACATACAAAGAAAGAGAAAACGCTTTTATCCACTTAAATACTAGTAGTACTCATCAAAATGAATCTGATCAAACCCTTCAACTTTTCCCAATAAGGAATGGAGATCATGGATGCACTGATCATCATCATCATCATCATAACATTATCAAAGAGACACAGATATCAGCTTCAGCAATCAATGCACCCAACCAGTTTATTGAGTTTCTTCCCTTGAAAAACTGA 

Я пытаюсь подсчитать количество появления подстроки «ATG» в приведенной выше строке (это только одна строка без разрывов строк). Мой файл содержит десятки (10) этих последовательностей, и я хочу иметь возможность подсчитать, сколько " ATG "в каждой последовательности. Каждая последовательность отделена от других пустой строкой.

Я пробовал grep, но не знал, какие опции мне следует использовать (если вообще grep может решить проблему), и я googled для любого awk-примера, но я его не нашел.

Возвращает количество вхождений ATG в каждой строке:

 awk -F'ATG' 'NF{print NF-1}' testfile 

Это работает для файлов с одной или несколькими линиями.

Пример 1

Рассмотрим этот тестовый файл:

 $ cat testfile xxATGxxATG ATGxxxATGxxx xxATGxxxxATGxxATGxx 

Код правильно подсчитывает вхождения ATG:

 $ awk -F'ATG' 'NF{print NF-1}' testfile 2 2 3 

Пример 2.

Используя пример в текущей версии вопроса:

 $ cat >file1 ATGTGGATGGTGGGTTACAATGAAGGTGGTGAGTTCAACATGGCTGATTATCCATTCAGTGGAAGGAAACTAAGGCCTCTCATTCCAAGACCAGTCCCAGTCCCTACTACTTCTCCTAACAGCACTTCAACTATAACTCCTTCCTTAAACCGCATTCATGGTGGCAATGATTTATTTTCACAATATCATCACAATCTGCAGCAGCAAGCATCAGTAGGAGATCATAGCAAGAGATCAGAGTTGAATAATAATAATAATCCATCTGCAGCAGTTGTGGTGAGTTCAAGATGGAATCCAACACCAGAACAGTTAAGAGCACTGGAAGAATTGTATAGAAGAGGAACAAGAACACCTTCTGCTGAGCAAATCCAACAAATAACTGCCCAGCTTAGAAAATTTGGAAAAATTGAAGGCAAAAATGTTTTCTATTGGTTTCAGAATCACAAAGCCAGAGAAAGGCAAAAACGACGGCGTCAAATGGAATCAGCAGCTGCTGAGTTTGATTCTGCTATTGAAAAGAAAGACTTAGGCGCAAGTAGG ACAGTGTTTGAAGTTGAACACACTAAAAACTGGCTACCATCTACAAATTCCAGTACCAGTACTCTTCATCTTGCAGAGGAATCTGTTTCAATTCAAAGGTCAGCAGCAGCAAAAGCAGATGGATGGCTCCAATTCGATGAAGCAGAATTACAGCAAAGAAGAAACTTTATGGAAAGGAATGCCACGTGGCATATGATGCAGTTAACTTCTTCTTGTCCTACAGCTAGCATGTCCACCACAACCACAGTAACAACTAGACTTATGGACCCAAAACTCATCAAGACCCATGAACTCAACTTATTCATTTCACCTCACACATACAAAGAAAGAGAAAACGCTTTTATCCACTTAAATACTAGTAGTACTCATCAAAATGAATCTGATCAAACCCTTCAACTTTTCCCAATAAGGAATGGAGATCATGGATGCACTGATCATCATCATCATCATCATAACATTATCAAAGAGACACAGATATCAGCTTCAGCAATCAATGCACCCAACCAGTTTATTGAGTTTCTTCCCTTGAAAAACTGA 

Это приводит к:

 $ awk -F'ATG' 'NF{print NF-1}' file1 9 15 

Как это работает

awk неявно проходит через каждую строку файла. Каждая строка делится на поля.

  • -F'ATG'

    Это говорит awk использовать ATG в качестве разделителя полей.

  • NF{print NF-1}

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

    (В пустых строках число полей NF равно нулю. Таким образом, условие NF оценивается как ложное в этих строках, эффективно пропуская их.)

От man grep

 -o, --only-matching Print only the matched (non-empty) parts of a matching line, with each such part on a separate output line. 

Таким образом, вы можете попробовать

 $ grep -o 'ATG' file | wc -l 

Улучшение идеи тахоми о grep -o, с тестовым файлом John1024, вот способ включить как счет, так и указать, какая строка входного файла имеет этот счет, в случае, если вы создаете тысячи строк, а в более поздней точке может нужно точно определить, из какой строки пришел счет.

Во-первых, образец файла, основанный на немного другой версии тестового файла John1024,

 $ cat testfile2 xxATGxxATG ATGxxxATGxxx xxATGxxxxATGxxATG 

Если вы добавите -n для отображения номера строки в исходном вводе, вы увидите:

 $ grep -no ATG testfile2 1:ATG 1:ATG 3:ATG 3:ATG 5:ATG 5:ATG 5:ATG 

Наконец, используйте uniq -c для подсчета:

 $ grep -no ATG testfile2 | uniq -c 2 1:ATG 2 3:ATG 3 5:ATG 

Итак, теперь у вас есть оба счета ATG , а также номер строки (входного файла), из которой пришел счет.

Вы также можете преобразовать его, чтобы показывать только счет, используя awk :

 $ grep -no ATG testfile2 | uniq -c | awk '{print $1}' 2 2 3 

Awk $1 относится к первому полю.

Вы можете использовать секцию nl -d для сброса счетчиков для каждого набора.

После копирования ваших данных в буфер обмена …

 xsel | sed '/./!G;s/\n/::::::&::::/;s/ATG/&\ /g' | nl -d:: -v0 

… дает …

  0 ATG 1 TGGATG 2 GTGGGTTACAATG 3 AAGGTGGTGAGTTCAACATG 4 GCTGATTATCCATTCAGTGGAAGGAAACTAAGGCCTCTCATTCCAAGACCAGTCCCAGTCCCTACTACTTCTCCTAACAGCACTTCAACTATAACTCCTTCCTTAAACCGCATTCATG 5 GTGGCAATG 6 ATTTATTTTCACAATATCATCACAATCTGCAGCAGCAAGCATCAGTAGGAGATCATAGCAAGAGATCAGAGTTGAATAATAATAATAATCCATCTGCAGCAGTTGTGGTGAGTTCAAGATG 7 GAATCCAACACCAGAACAGTTAAGAGCACTGGAAGAATTGTATAGAAGAGGAACAAGAACACCTTCTGCTGAGCAAATCCAACAAATAACTGCCCAGCTTAGAAAATTTGGAAAAATTGAAGGCAAAAATG 8 TTTTCTATTGGTTTCAGAATCACAAAGCCAGAGAAAGGCAAAAACGACGGCGTCAAATG 9 GAATCAGCAGCTGCTGAGTTTGATTCTGCTATTGAAAAGAAAGACTTAGGCGCAAGTAGG 0 ACAGTGTTTGAAGTTGAACACACTAAAAACTGGCTACCATCTACAAATTCCAGTACCAGTACTCTTCATCTTGCAGAGGAATCTGTTTCAATTCAAAGGTCAGCAGCAGCAAAAGCAGATG 1 GATG 2 GCTCCAATTCGATG 3 AAGCAGAATTACAGCAAAGAAGAAACTTTATG 4 GAAAGGAATG 5 CCACGTGGCATATG 6 ATG 7 CAGTTAACTTCTTCTTGTCCTACAGCTAGCATG 8 TCCACCACAACCACAGTAACAACTAGACTTATG 9 GACCCAAAACTCATCAAGACCCATG 10 AACTCAACTTATTCATTTCACCTCACACATACAAAGAAAGAGAAAACGCTTTTATCCACTTAAATACTAGTAGTACTCATCAAAATG 11 AATCTGATCAAACCCTTCAACTTTTCCCAATAAGGAATG 12 GAGATCATG 13 GATG 14 CACTGATCATCATCATCATCATCATAACATTATCAAAGAGACACAGATATCAGCTTCAGCAATCAATG 15 CACCCAACCAGTTTATTGAGTTTCTTCCCTTGAAAAACTGA 

sed просто добавляет новую строку после каждого появления строки ATG она находит во вводе. sed также преобразует пустые строки, чтобы выглядеть так:

 :::::: :::: 

nl делит логические страницы на свой раздел -d который здесь установлен в :: . Три секции -d исключений в строке сами по себе указывают на конец логической страницы, которую nl заменяет пустой строкой, и два таких начала нового. Я начинаю каждый счет при -v0 ноль, потому что последняя последовательность в любой цепочке не будет содержать строку ATG .

Для менее дескриптивного вывода вы можете просто преобразовать каждую последовательность ATG в символ, который иначе не отображается на вашем входе, и -d elet the difference.

 xsel | sed 's/ATG/./g' | tr -dc . | wc -c 

… который заменяет каждый ATG на вход с точкой, удаляет все байты, которые не являются точками, а затем подсчитывает байты:

 24