Подсчет строк / символов между шаблонами с использованием bash - PullRequest
0 голосов
/ 13 июня 2018

Я хотел бы посчитать все символы (ACGT) для каждого объекта (здесь GeneID:1, gi|479, nf|NZ_AC14), чтобы я знал длину каждого из этих объектов (не нужно подсчитывать число A, число C ..)

>GeneID:1
ATGCGTTTGCGTTTGCAAATCGACTAGCTTTTGGCCCAAAGCGTGCTGCAAAAGTATGGA
AGTAAAGCTACCGTACGTAGCTAAGCCTACCGATCGATCGATCGATCGACGCCCCCCCCC
>gi|479
ATGGATTGGATGGAATCACAATTCAAGACATGTACGCATGGCTGCGACTGGAAG
>nf|NZ_AC14
ATGGCTAGATATGTCGTATGTTGGATGTTCACCATCAACAATCCCG

У меня есть несколько таких файлов, и я хотел бы использовать команду bash, чтобы все было автоматизировано, но я даже не знаю, с чего начать (в основном, как я буду считать только после начала строки с >)

Желаемый результат будет:

>GeneID:1 121
>gi|479 54
>nf|NZ_AC14 47

, но если у меня есть только номер, это тоже нормально.

Спасибо

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Использование awk:

awk -v RS='>[^\n]+' 'oRT{gsub("\n","");print oRT,length()}{oRT=RT}'  file

В качестве разделителя записей устанавливается имя гена, начинающееся с >.Все поля записи объединяются путем удаления новых строк.Затем печатается длина записи.

Переменная oRT устанавливается для захвата ограничителя записи RT предыдущей строки.

0 голосов
/ 13 июня 2018

Вы можете использовать следующую команду awk:

ВХОД:

$ more input
>GeneID:1
ATGCGTTTGCGTTTGCAAATCGACTAGCTTTTGGCCCAAAGCGTGCTGCAAAAGTATGGA
AGTAAAGCTACCGTACGTAGCTAAGCCTACCGATCGATCGATCGATCGACGCCCCCCCCC
>gi|479
ATGGATTGGATGGAATCACAATTCAAGACATGTACGCATGGCTGCGACTGGAAG
>nf|NZ_AC14
ATGGCTAGATATGTCGTATGTTGGATGTTCACCATCAACAATCCCG

КОМАНДА:

awk '/^>/{if(NR>1){print tmp OFS l;} l=0; tmp=$0; next}{l+=length($0)}END{print tmp OFS l;}' input 
>GeneID:1 120
>gi|479 54
>nf|NZ_AC14 46

Пояснения:

  • /^>/{if(NR>1){print tmp OFS l;} l=0; tmp=$0; next} при достижении строки, начинающейся с >, вы проверяете, что это не первая строка, если вы печатаете регистрсодержание tmp и l;Вы инициализируете l в 0 и tmp в содержимом этой строки
  • {l+=length($0)} для других строк, подсчитываете, сколько символов присутствует, и добавляете его в l
  • END{print tmp OFS l;} при достижении конца файла вы печатаете содержимое переменных для обработки последней группы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...