如何通过哈希表查询A文件中的查询信息在B文件中的具体内容
时间:2010-11-18
来源:互联网
其中A中内容为
gi|20178371|ref|NP_619791.1|
gi|20178373|ref|NP_619794.1|
gi|20178378|ref|NP_619799.1|
gi|20178380|ref|NP_619801.1|
gi|20178381|ref|NP_619802.1|
B为
gi|20178371|ref|NP_619791.1| gi|9627716|ref|NP_042238.1|
gi|20178371|ref|NP_619792.1| gi|9627716|ref|NP_042232.1|
gi|20178371|ref|NP_619793.1| gi|9627716|ref|NP_323443.1|
gi|20178373|ref|NP_619794.1| gi|9627716|ref|NP_566666.1|
gi|20178378|ref|NP_619799.1| gi|9627716|ref|NP_042111.1|
gi|20178378|ref|NP_619800.1| gi|9627716|ref|NP_042111.1|
gi|20178380|ref|NP_619801.1| gi|9627716|ref|NP_342321.1|
gi|20178381|ref|NP_619802.1| gi|9627716|ref|NP_042132.1|
我想得到如下的结果
gi|20178371|ref|NP_619791.1| gi|9627716|ref|NP_042238.1|
gi|20178373|ref|NP_619794.1| gi|9627716|ref|NP_566666.1|
gi|20178378|ref|NP_619799.1| gi|9627716|ref|NP_042111.1|
gi|20178380|ref|NP_619801.1| gi|9627716|ref|NP_342321.1|
gi|20178381|ref|NP_619802.1| gi|9627716|ref|NP_042132.1|
#useage: perl x1.pl A B
open (F1,"$ARGV[0]");
open (F2,"$ARGV[1]");
open (F3,">gi_name");
select F3;
while (<F1>) {
if (/^gi\|(\d+)\|re/) {
$hash{$1}=$_;
}
}
while ($gi=<F2>) {
if ($gi =~ /^gi\|(\d+)\|re/) {
if (exists $hash{$1}) {
print $hash{$1};
}
}
}
但我的程序的结果是这样的
gi|20178371|ref|NP_619791.1|
gi|20178373|ref|NP_619794.1|
gi|20178378|ref|NP_619799.1|
gi|20178380|ref|NP_619801.1|
gi|20178381|ref|NP_619802.1| gi|9627716|ref|NP_042132.1|
我想请问下为什么前几个号的对应信息没有提出来,万分感谢,新手,不是很懂,刚刚学!
作者: sunbaofa 发布时间: 2010-11-18
open (F1,"$ARGV[0]");
open (F2,"$ARGV[1]");
open (F3,">gi_name");
select F3;
while (<F1>) {
if (/^gi\|(\d+)\|re/) {
$hash{$1}=$_;
}
}
while ($gi=<F2>) {
if ($gi =~ /^gi\|(\d+)\|re/) {
if (exists $hash{$1}) {
print $hash{$1};
}
}
}
这个是我编的一个程序
作者: sunbaofa 发布时间: 2010-11-18
#useage: perl x1.pl A B
换成
#useage: perl x1.pl B A结果也不对,只显示A文件中的号对应的最后一行内容
,不能提取全部信息。
作者: sunbaofa 发布时间: 2010-11-18
- #!/usr/bin/perl
- #useage: perl x1.pl A B
-
- use strict;
- use warnings;
-
- my %hash;
- open (F1,"$ARGV[0]");
- while (<F1>) {
- chomp;
- $hash{$_} = 1;
- }
- close F1;
-
- open (F3,">gi_name");
- open (F2,"$ARGV[1]");
- while (<F2>) {
- my ($key,$value) = split /\s+/;
- if (exists $hash{$key}) {
- print F3 "$_";
- }
- }
- close F2;
- close F3;
-
- <STDIN>;
作者: iamlimeng 发布时间: 2010-11-18
是要文件2中的前两列数字和文件1中一样的就输出吗?
- #useage: perl x1.pl A B
- open (F1,"$ARGV[0]");
- open (F2,"$ARGV[1]");
- open (F3,">gi_name");
- select F3;
- while (<F1>) {
- chomp;
- $hash{$1} = 1;
- }
- while ($gi=<F2>) {
- if ($gi =~ /^(gi|\d+|ref|NP_\d+\.\d|)/) {
- if (exists $hash{$1}) {
- print;
- }
- }
- }
作者: zhlong8 发布时间: 2010-11-18
只要第1列相同就行,就相当于A是一个检索条目,要在B中检索到它所对应的所有内容
作者: sunbaofa 发布时间: 2010-11-18
#useage: perl x1.pl A B
open (F1,"$ARGV[0]"

open (F2,"$ARGV[1]"

open (F3,">gi_name"

select F3;
while (<F1>

if (/^gi\|(\d+)\|re/) {
$hash{$1}=$_;
}
}
while ($gi=<F2>

if ($gi =~ /^gi\|(\d+)\|re/) {
if (exists $hash{$1}) {
print $gi};
}
}
}
最后1句命令改成print $gi就可以了,是自己没注意,打另一个文件的内容了。看了两位的程序想起自己问题了,呵呵,以后多像前辈学习!

作者: sunbaofa 发布时间: 2010-11-18
请楼主把需求描述清楚,按你的逻辑,就互相矛盾了。若只是按第一列的数值来判断,那你在1楼给出的结果就是错的。我看你在1楼的结果,貌似可以用A文件的行来进行判断。
晕了...
作者: iamlimeng 发布时间: 2010-11-18
作者: sunbaofa 发布时间: 2010-11-18
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28