紧急求助,大家帮忙啊!送上100分.

haokk 2002-08-05 11:04:38
文件的格式是象下面这样,然后不断重复,见后面的文件:
Query = text1.txt filetype.txt file:
(380)

Score = 30 hi = 50, Except = 0.056
Query: 120 abcdefg 160

Score = 30 hi = 50, Except = 0.05
Query: 130 abcdefg 150

Score = 30 hi = 50, Except = 0.45
Query: 130 abcdefg 160

现在要做的是:如果它满足Except<0.1那么求Query的差值的和,如:Except = 0.056 (小于0.1),160-120 =40;Except = 0.05(小于0.1) ,150-130 = 20 ,Except=0.45(大于0.1),差值舍去。
所以Query的差值的和为:40+20=60 ;若 Query的差值的和即60除以380 后小于0.5,那么就取出 text1.txt这个名字,把它放到report.txt中.

我现在只能通过配匹得到一些值,但是对于循环的结构没有弄清楚.而且如果一行一行的读的话,怎麽保存值啊.
我写的perl的程序是这样的:
#!/perl/bin/perl -w
my $REPORT_FILE = "report.txt";
my $input_file = $ARGV[0] || 'input.dat';

unless ( -e $input_file ) {
die "$0: ERROR: missing file: $input_file";
}

open (INFILE, $input_file) or die "$0: ERROR: $input_file: $!";

while (my $line = <INFILE>) {#这里面肯定还要循环,我找不到分组单位循环)
# query name
if($line =~/^(Query).*:$/){
@words = split(/s+/,$line);
$name = $words[2];
}

#total query letters
if($line =~/^\s+\((\d+)\)$/){
$query_letters = $1 ;
}

#if except value<1e1,then count $query num.
if($line =~/\sScore.*\d+/ ){
@words=split(/\s+/,$line);
$Except = $words[8];
if($Except < 1e1){
# 计算$query的值,并加起来.$Quey_total
}
}
#如果$Query_total/$query_letters<0.5 ,那么把 $name 输出到report.txt中去.

}

close(INFILE);
close(REPORT);






文本格式如下:
Query = text1.txt filetype.txt file:
(680)

Score = 30 hi = 50, Except = 0.35
Query: 120 abcdefg 160

Score = 30 hi = 50, Except = 0.45
Query: 130 abcdefg 150

Score = 30 hi = 50, Except = 0.45
Query: 130 abcdefg 150



Query = text2.txt filetype.txt file:
(380)

Score = 30 hi = 50, Except = 0.35
Query: 120 abcdefg 160

Score = 30 hi = 50, Except = 0.45
Query: 130 abcdefg 150

Score = 30 hi = 50, Except = 0.45
Query: 130 abcdefg 160




Query = text3.txt filetype.txt file:
(380)

Score = 30 hi = 50, Except = 0.01
Query: 120 abcdefg 160

Score = 30 hi = 50, Except = 0.45
Query: 130 abcdefg 150

Score = 30 hi = 50, Except = 0.45
Query: 130 abcdefg 160



Query = text4.txt filetype.txt file:
(380)

Score = 30 hi = 50, Except = 0.35
Query: 120 abcdefg 160

Score = 30 hi = 50, Except = 0.45
Query: 130 abcdefg 150

Score = 30 hi = 50, Except = 0.45
Query: 130 abcdefg 160

......

...全文
25 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tl66 2002-08-14
  • 打赏
  • 举报
回复
保密啊, 以后可以交流哦 ^_^
tl66 2002-08-13
  • 打赏
  • 举报
回复
楼上兄弟在搞所谓的生物信息学吗? 我也每天都在处理这样的文件哦 ^_^
haokk 2002-08-13
  • 打赏
  • 举报
回复
是啊,你在哪儿上班?
liu22 2002-08-06
  • 打赏
  • 举报
回复
#!/perl/bin/perl -w

%hash =(1=>10,5=>13,12=>25,10=>28,8=>34,50=>57);
$n = 0;
$start = 0;
$big = 0;
$length = 0;
$x = keys %hash;

foreach $key (sort greater keys %hash)
{
if ($n == 0)
{
$start = $key;
}
elsif ($key > $big)
{
$length += $big - $start + 1;
$start = $key;
$big = $hash{$key};
}
if ($n == $x-1)
{
$length += $big - $start + 1;
}
$big = ($hash{$key} > $big)? $hash{$key} : $big;
$n++;
}

sub greater
{
$a <=> $b;
}

print "$length\n";

exit;

你试试,有BUG请贴出来!
haokk 2002-08-06
  • 打赏
  • 举报
回复
知道对每个 $hash{$key}>$key ;请帮我看看这里有什么bug?谢谢你的答复.

#!/perl/bin/perl -w

%hash = ( 2=>23,3=>34,1=>12,38=>63,45=>55,34=>35 ,95=>98);
$total_query = 0;
sub hashsort{ $a<=>$b;}
$i=0;
foreach $key (sort hashsort keys %hash){
if($i==0){
$start = $key;
$end = $hash{$key};
}
else{
if($key<=$end && $hash{$key}<=$end){;}
if($key<=$end && $hash{$key}>=$end){
$end= $hash{$key};
}
if($key>$end){
push(@total,$end-$start+1);
$start = $key;
$end = $hash{$key};
}
}
$i=1;
print "$key\t$hash{$key}\n";
}

push(@total,$end-$start+1);
foreach(@total){
$total_query += $_;
}
print $total_query;
haokk 2002-08-06
  • 打赏
  • 举报
回复
知道对每个 $hash{$key}>$key ;请帮我看看这里有什么bug?谢谢你的答复.

#!/perl/bin/perl -w

%hash = ( 2=>23,3=>34,1=>12,38=>63,45=>55,34=>35 ,95=>98);
$total_query = 0;
sub hashsort{ $a<=>$b;}
$i=0;
foreach $key (sort hashsort keys %hash){
if($i==0){
$start = $key;
$end = $hash{$key};
}
else{
if($key<=$end && $hash{$key}<=$end){;}
if($key<=$end && $hash{$key}>=$end){
$end= $hash{$key};
}
if($key>$end){
push(@total,$end-$start+1);
$start = $key;
$end = $hash{$key};
}
}
$i=1;
print "$key\t$hash{$key}\n";
}

push(@total,$end-$start+1);
foreach(@total){
$total_query += $_;
}
print $total_query;
haokk 2002-08-05
  • 打赏
  • 举报
回复
还有一个问题如下:
%hash =( 1=>10,5=>13,12=>25,10=>28,8=>34,50=>57)
计算 $hash{$key} - $key 的值 的和很容易.
10-1=9,
13-5=8,
25-12=13,
28-10=18,
...
程序可以是:
foreach $key(%hash){
$total += $hash{$key}-$key;
}
但现在要求的是:1-10,5-13,12-25,10-28,8-34,50-57,要求这样的区间段没有重复的部分,即 1-10,5-13就只计算1-13,不是(10-1+1)+(13-5+1)这么多数.
这个例子其实只求: 1-34,50-57,所以不重复的和为 : 34+8=42个数.

那么这样的话,程序应该怎麽写啊,我想了半天,也不知道对不对,希望哪位大侠能给与指点.赶急不尽,分数送上.
sub hashsort{ $hash{$a} <=> $hash{$b};}

for $key (sort hashsort keys %hash){
$i = $key;
$j = $hash_value{$key};
for $key2 (sort hashsort keys %hash){
if($j>$key2){
if($i>$key2){
$query_length = 0;
}
if($i<$key2){ $query_length= $hash{$key2} - $i ;
}
}
$total_query += $query_length;
}

haokk 2002-08-05
  • 打赏
  • 举报
回复
还有一个问题如下:
%hash =( 1=>10,5=>13,12=>25,10=>28,8=>34,50=>57)
计算 $hash{$key} - $key 的值 的和很容易.
10-1=9,
13-5=8,
25-12=13,
28-10=18,
...
程序可以是:
foreach $key(%hash){
$total += $hash{$key}-$key;
}
但现在要求的是:1-10,5-13,12-25,10-28,8-34,50-57,要求这样的区间段没有重复的部分,即 1-10,5-13就只计算1-13,不是(10-1+1)+(13-5+1)这么多数.
这个例子其实只求: 1-34,50-57,所以不重复的和为 : 34+8=42个数.

那么这样的话,程序应该怎麽写啊,我想了半天,也不知道对不对,希望哪位大侠能给与指点.赶急不尽,分数送上.
sub hashsort{ $hash{$a} <=> $hash{$b};}

for $key (sort hashsort keys %hash){
$i = $key;
$j = $hash_value{$key};
for $key2 (sort hashsort keys %hash){
if($j>$key2){
if($i>$key2){
$query_length = 0;
}
if($i<$key2){ $query_length= $hash{$key2} - $i ;
}
}
$total_query += $query_length;
}

liu22 2002-08-05
  • 打赏
  • 举报
回复
#!/perl/bin/perl -w

$REPORT_FILE = "report.txt";
$input_file = $ARGV[0] || 'input.dat';

unless ( -e $input_file ) {
die "$0: ERROR: missing file: $input_file";
}

open (REPORT, ">$REPORT_FILE");
open (INFILE, $input_file) or die "$0: ERROR: $input_file: $!";

while ($line = <INFILE>)
{
chomp $line;
# query name
if($line =~/^(Query).*:$/)
{
if ($Query_total && $query_letters && $Query_total/$query_letters < 0.5)
{
print REPORT "$name\n";
$Query_total = 0;
$query_letters = 0;
}
@words = split(/\s+/,$line);
$name = $words[2];
}

#total query letters
elsif($line =~/^\s+\((\d+)\)$/)
{
$query_letters = $1 ;
}

#if except value<1e1,then count $query num.
elsif($line =~/Score/ )
{
@words=split(/\s+/,$line);
$Except = $words[8];
}
elsif ($line =~/abcdefg/)
{
@words=split(/\s+/,$line);
if($Except < 0.1)
{
$Query_total += $words[4]-$words[2];
}
}
}

if ($Query_total && $query_letters && $Query_total/$query_letters < 0.5)
{
print REPORT "$name\n";
}

close(INFILE);
close(REPORT);

exit;

2,204

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 CGI
社区管理员
  • CGI社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧