我有一个具有这种结构的文件:
文件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,我想知道是否有任何其他方法来获得我需要的输出。
非常感谢您的帮助。 欢呼声,
答案 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;