2013-12-09 7 views
1

У меня есть файл с такой структурой:Файл с нерегулярной AWK

file1

>ENSGALG00000000011|ENSGALT00000000012|57|1123|1125 
cttttccactttgctctcatcCTGCTATTGGATTTgagatgcatgtcTGTTAATATTGTA 
AGATTGGTGGTACATGACTGTCCTCTTTGGGATATATTTGACAGTGACTGGTATACTTCT 
CGCAGTCTCATTGGAGGAGCTGATATTATTGTGATTaaatactctgtcaatGACAAGACT 
>ENSGALG00000000012|ENSGALT00000000013|57|1145|1155 
cttttccactttgctctcatcCTGCTATTGGATTTgagatgcatgtcTGTTAATATTGTA 
GCCAATCACATTAGAAATCCTGTTTTTACTGAATATCAAGCCTGCGTGTTTGGAAATGTC 
AGATTGGTGGTACATGACTGTCCTCTTTGGGATATATTTGACAGTGACTGGTATACTTCT 
CGCAGTCTCATTGGAGGAGCTGATATTATTGTGATTaaatactctgtcaatGACAAGACT 
>ENSGALG00000000015|ENSGALT00000000014|57|1144|1155 
GCCAATCACATTAGAAATCCTGTTTTTACTGAATATCAAGCCTGCGTGTTTGGAAATGTC 
AGATTGGTGGTACATGACTGTCCTCTTTGGGATATATTTGACAGTGACTGGTATACTTCT 
CGCAGTCTCATTGGAGGAGCTGATATTATTGTGATTaaatactctgtcaatGACAAGACT 

Я хочу использовать другой файл, чтобы извлечь из них, которые имеют определенную идею в первой части, то есть использовать этот файл:

file2 Код:

ENSGALG00000000011 
ENSGALG00000000015 

Хотеть конечный результат будет так:

>ENSGALG00000000011|ENSGALT00000000012|57|1123|1125 
cttttccactttgctctcatcCTGCTATTGGATTTgagatgcatgtcTGTTAATATTGTA 
AGATTGGTGGTACATGACTGTCCTCTTTGGGATATATTTGACAGTGACTGGTATACTTCT 
CGCAGTCTCATTGGAGGAGCTGATATTATTGTGATTaaatactctgtcaatGACAAGACT 
>ENSGALG00000000015|ENSGALT00000000014|57|1144|1155 
GCCAATCACATTAGAAATCCTGTTTTTACTGAATATCAAGCCTGCGTGTTTGGAAATGTC 
AGATTGGTGGTACATGACTGTCCTCTTTGGGATATATTTGACAGTGACTGGTATACTTCT 
CGCAGTCTCATTGGAGGAGCTGATATTATTGTGATTaaatactctgtcaatGACAAGACT 

Я знаю, что этот код:

awk -F"|" 'FNR==NR{A[">"$1];next}($1 in A){print;getline;print}' file2 file1 

, но проблема в том, что это только дает мне первую строку содержимого каждого из заголовков , По-видимому, это происходит потому, что AWK ищет аналогичную модель, но я знаю только AWK, мне было интересно, есть ли другой способ получить нужный мне результат.

Большое спасибо за вашу помощь. Cheers,

+0

Так что вам нужно многострочный regex, который захватывает что-то вроде '/> ENSGALG00000000011 [^>] * /', правильно? – abiessu

ответ

1

Он недоволен отправкой запросов на получение кода, где вы почти ничего не предпринимали, чтобы решить проблему; однако я слишком устал, чтобы настаивать на этом. Эта программа Perl будет делать, как вы просите.

use strict; 
use warnings; 

my %wanted; 

{ 
    open my $fh, '<', 'file2.txt' or die $!; 
    while (<$fh>) { 
    my ($key) = /(\S*)/; 
    $wanted{$key} = 1 if $key; 
    } 
} 

{ 
    open my $fh, '<', 'file1.txt' or die $!; 
    local $/ = '>'; 
    while (<$fh>) { 
    chomp; 
    my ($key) = /(\w*)/; 
    print ">$_" if $key and $wanted{$key}; 
    } 
} 

выход

>ENSGALG00000000011|ENSGALT00000000012|57|1123|1125 
cttttccactttgctctcatcCTGCTATTGGATTTgagatgcatgtcTGTTAATATTGTA 
AGATTGGTGGTACATGACTGTCCTCTTTGGGATATATTTGACAGTGACTGGTATACTTCT 
CGCAGTCTCATTGGAGGAGCTGATATTATTGTGATTaaatactctgtcaatGACAAGACT 
>ENSGALG00000000015|ENSGALT00000000014|57|1144|1155 
GCCAATCACATTAGAAATCCTGTTTTTACTGAATATCAAGCCTGCGTGTTTGGAAATGTC 
AGATTGGTGGTACATGACTGTCCTCTTTGGGATATATTTGACAGTGACTGGTATACTTCT 
CGCAGTCTCATTGGAGGAGCTGATATTATTGTGATTaaatactctgtcaatGACAAGACT 
+0

Благодарим вас за ответ. Конечно, я знаю, что это очень неправильно, но это то, что происходит, когда вы должны делать много за короткое время, и вы так мало знаете. Пожалуйста, примите мои извинения. –

+1

Изменение разделителя конца строки ... Мне это нравится ... – abiessu

+0

@ user3083423 - просто имейте в виду, что вы не получите слишком далеко, если будете продолжать делать это. Если ваше должностное задание ожидает, что вы сможете обрабатывать большие текстовые данные, изучите Perl. –

1

Awk:

awk -F '|' 'NR==FNR {code[">" $1]=1; next} /^>/ {p = ($1 in code)} p' file2 file1 
>ENSGALG00000000011|ENSGALT00000000012|57|1123|1125 
cttttccactttgctctcatcCTGCTATTGGATTTgagatgcatgtcTGTTAATATTGTA 
AGATTGGTGGTACATGACTGTCCTCTTTGGGATATATTTGACAGTGACTGGTATACTTCT 
CGCAGTCTCATTGGAGGAGCTGATATTATTGTGATTaaatactctgtcaatGACAAGACT 
>ENSGALG00000000015|ENSGALT00000000014|57|1144|1155 
GCCAATCACATTAGAAATCCTGTTTTTACTGAATATCAAGCCTGCGTGTTTGGAAATGTC 
AGATTGGTGGTACATGACTGTCCTCTTTGGGATATATTTGACAGTGACTGGTATACTTCT 
CGCAGTCTCATTGGAGGAGCTGATATTATTGTGATTaaatactctgtcaatGACAAGACT 

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

1

Другой awk

awk 'FNR==NR {a[$0];next} NF {for (i in a) if (i~$0) print ">"$0} ' RS=">" file2 file1 
>ENSGALG00000000011|ENSGALT00000000012|57|1123|1125 
cttttccactttgctctcatcCTGCTATTGGATTTgagatgcatgtcTGTTAATATTGTA 
AGATTGGTGGTACATGACTGTCCTCTTTGGGATATATTTGACAGTGACTGGTATACTTCT 
CGCAGTCTCATTGGAGGAGCTGATATTATTGTGATTaaatactctgtcaatGACAAGACT 

>ENSGALG00000000015|ENSGALT00000000014|57|1144|1155 
GCCAATCACATTAGAAATCCTGTTTTTACTGAATATCAAGCCTGCGTGTTTGGAAATGTC 
AGATTGGTGGTACATGACTGTCCTCTTTGGGATATATTTGACAGTGACTGGTATACTTCT 
CGCAGTCTCATTGGAGGAGCTGATATTATTGTGATTaaatactctgtcaatGACAAGACT 
1

Это формат FASTA файл и есть очень простой способ читать и писать:

#!/bin/perl 

use strict; 
use Bio::SeqIO; 

my $file   = shift; # get the file name, somehow 
my $seqio_object = Bio::SeqIO->new(-file => $file); 
my $seq_object = $seqio_object->next_seq; 

http://www.bioperl.org/wiki/HOWTO:SeqIO

+0

Это не ответ на вопрос, который задал вопрос, как выбрать последовательности из файла FASTA в соответствии с идентификаторами в другом файле. Чтение файла простое, и модуль не нужен. – Borodin

+0

@Borodin Я не уверен, что новая работа, сильно используемая модулем биообмена, - хорошая идея. Чтение FASTA прост и быстр. Здесь вам вообще не нужен AWK. Вы ничего не собираетесь спасти, используя AWK. – alex

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