具有不规则图案的文件AWK

时间:2013-12-09 15:39:16

标签: perl awk

我有一个具有这种结构的文件:

文件1

>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,我想知道是否有任何其他方法来获得我需要的输出。

非常感谢您的帮助。 欢呼声,

4 个答案:

答案 0 :(得分: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

答案 1 :(得分: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。

答案 2 :(得分: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

答案 3 :(得分: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