получить определенную последовательность из файла fasta с помощью Regex

Я хотел бы получить nth последовательность (или предпочтительно nth по mth последовательность) из входного файла fasta, в идеале с unix "один лайнер".

Я знаю, что могу прочитать последовательность с помощью Perl (или любого другого языка сценариев), посчитать, а затем распечатать последовательность, но я ищу что-то более быстрое и компактное.

Для тех, кто не в курсе, пример файла fasta выглядит следующим образом:

>SEQUENCE_1
MTEITAAMVKELRESTGAGMMDCKNALSETNGDFDKAVQLLREKGLGKAAKKADRLAAEG
LVSVKVSDDFTIAAMRPSYLSYEDLDMTFVENEYKALVAELEKENEERRRLKDPNKPEHK
IPQFASRKQLSDAILKEAEEKIKEELKAQGKPEKIWDNIIPGKMNSFIADNSQLDSKLTL
MGQFYVMDDKKTVEQVIAEKEKEFGGKIKIVEFICFEVGEGLEKKTEDFAAEVAAQL
>SEQUENCE_2
SATVSEINSETDFVAKNDQFIALTKDTTAHIQSNSLQSVEELHSSTINGVKFEEYLKSQI
ATIGENLVVRRFATLKAGANGVVNGYIHTNGRVGVVIAAACDSAEVASKSRDLLRQICMH

person saladi    schedule 20.06.2013    source источник
comment
Не могли бы вы обновить вопрос, чтобы точно отразить то, что вы ищете? Что-то вроде этого - мой желаемый результат, и это то, что я пробовал.   -  person jaypal singh    schedule 21.06.2013
comment
@Endoro Извините, если это было неясно. Если у меня есть 10 последовательностей в файле fasta и я хочу получить 5-ю, то n будет равно 5. Мне понадобится заголовок (который начинается с ›) и строки под ним до следующей ›, которая отмечает следующую последовательность. Это помогает?   -  person saladi    schedule 21.06.2013


Ответы (4)


Один из способов с awk:

awk -v RS='>' -v start=$n -v end=$m 'NR>=(start+1)&&NR<=(end+1){print ">"$0}' fasta_file
person jaypal singh    schedule 20.06.2013

Вот два способа использования awk.

Если ваши последовательности обернуты по 1 строке, это сработает:

awk -v n=5 -v m=8 'NR == n * 2 - 1, NR == m * 2' file.fa

Если ваши строки последовательности не завернуты, то это может быть более подходящим:

awk -v n=5 -v m=8 '/^>/ { c++ } c == n { f=1 } c == m + 1 { f=0 } f' file.fa
person Steve    schedule 20.06.2013

С sed:

sed -n '/SEQUENCE_'$n'/,/SEQUENCE_'$(($m + 1))'/p' input | sed '$d'
person perreal    schedule 20.06.2013

sed в одну строку (трубка | не нужна):

sed '/>SEQUENCE_'$n'/, />SEQUENCE_'$(($m + 1))'/!d;{/>SEQUENCE_'$(($m + 1))'/d}' file
person captcha    schedule 21.06.2013