2016-04-21 3 views
1

Существует ecoli.ffn файла со строками, указывающих имя генов секвенирования:извлечь каждое секвенирование данных в виде отдельного файла

$head ecoli.ffn 
>ecoli16:g027092:GCF_000460315:gi|545267691|ref|NZ_KE701669.1|:551259-572036 
ATGAGCCTGATTATTGATGTTATTTCGCGT 
AAAACATCCGTCAAACAAACGCTGATTAAT 
>ecoli16:g000011:55989:gi|218693476|ref|NC_011748.1|:1128430-1131042 
GTGTACGCTATGGCGGGTAATTTTGCCGAT 
>ecoli16:g000012:55989:gi|218693476|ref|NC_011748.1|:1128430-1131042 
GTGTACGCTATGGCGGGTAATTTTGCCGAT 
CTGACAGCTGTTCTTACACTGGATTCAACC 
CTGACAGCTGTTCTTACACTGGATTCAACC 

Как было показано выше, название гена находится между 1-ой и 2-ой толстой кишкой:

g027092 
g000011 
g000012 

Я хотел бы использовать ecoli.ffn для генерации трех файлов: g027092.txt, g000011.txt, g000012.txt, содержащий каждый файл последовательности.

Например, g027092.txt будет содержит исходные данные, но без заголовка:

$cat g027092.txt 
ATGAGCCTGATTATTGATGTTATTTCGCGT 
AAAACATCCGTCAAACAAACGCTGATTAAT 

Как сделать это?

ответ

2

awk на помощь!

$ awk -F: -v RS=">" 'NR==FNR{n=split($0,t,"\n"); 
          for(i=1;i<n;i++) a[t[i]]; 
          next} 
        $2 in a{file=$2".txt"; 
          sub(/[^\n]+\n/,""); 
          print > file}' index file 


$ head g*.txt 
==> g000011.txt <== 
GTGTACGCTATGGCGGGTAATTTTGCCGAT 


==> g000012.txt <== 
GTGTACGCTATGGCGGGTAATTTTGCCGAT 
CTGACAGCTGTTCTTACACTGGATTCAACC 
CTGACAGCTGTTCTTACACTGGATTCAACC 


==> g027092.txt <== 
ATGAGCCTGATTATTGATGTTATTTCGCGT 
AAAACATCCGTCAAACAAACGCTGATTAAT 

Объяснение

NR==FNR{n=sp... блок анализирует первый файл и создает справочной таблицы

$2 in a{file=$2".txt"; если текущая запись в таблице поиска, установить имя файла с помощью ключа и txt

sub(/[^\n]+\n/,"") удалить строку заголовка

print > file и распечатать до указанного имя файла.

+0

Hi @karakfa, можете вам немного объяснить, пожалуйста? –

+0

Делается. Awk настолько мощный и регулярный. – Ming

+0

Cheers @karafka !!! –

Смежные вопросы