我需要计算在比较两个文件时考虑特定数据分箱的不同对象的数量。第一个是三列文件(此处为test_counter.txt
),其中包含报告的ID对(ID由|
分隔),每个ID对都有一个与之关联的值。在另一个文件(list.pl
)中,我有一个简单的ID列表,写为$id{"ID1"} = 1;
。
因此,我需要的是计算每个bin中test_counter.txt
文件中的不同ID(间隔必须等于0.1)并且不重复(意味着如果ID在bin中存在两次)我只想算一次)。
三列文件(test_counter.txt
)如下所示:
d|a -0.1412
a|a -0.1526
d|a 0.12
c|b 0.16596
b|a 0.221
c|a 0.21123
d|b 0.388
c|b 0.35
b|d 0.412
d|a 0.5236
d|c 0.565
b|a 0.6174
a|c 0.65
c|d 0.678
list.pl
文件就像这样:
$id{"a"} = 1;
$id{"b"} = 1;
$id{"c"} = 1;
$id{"d"} = 1;
我想要的输出是这样的:
-0.9
-0.8
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1 2
0
0.1 4
0.2 3
0.3 3
0.4 2
0.5 3
0.6 4
0.7
0.8
0.9
我的代码是:
require("id_pf.pl");
$file = "test_counter.txt";
open(HAN, "< $file") || die "not opening $file";
@row = <HAN>;
close(HAN);
for($i=0;$i<=$#row;$i++) {
chomp($row[$i]);
($ppi,$val) = split(/ /,$row[$i]);
($p1,$p2) = split(/\|/,$ppi);
if ($val <-0.9) {
$bin= 1;
} elsif ($val <-0.8) {
$bin = 2;
} elsif ($val <-0.7) {
$bin = 3;
} elsif ($val <-0.6) {
$bin = 4;
} elsif ($val <-0.5) {
$bin = 5;
} elsif ($val <-0.4) {
$bin = 6;
} elsif ($val <-0.3) {
$bin = 7;
} elsif ($val <-0.2) {
$bin = 8;
} elsif ($val <-0.1) {
$bin = 9;
} elsif ($val <-0.0) {
$bin = 10;
} elsif ($val <0.1) {
$bin = 11;
} elsif ($val <0.2) {
$bin = 12;
} elsif ($val <0.3) {
$bin = 13;
} elsif ($val <0.4) {
$bin = 14;
} elsif ($val <0.5) {
$bin = 15;
} elsif ($val <0.6) {
$bin = 16;
} elsif ($val <0.7) {
$bin = 17;
} elsif ($val <0.8) {
$bin = 18;
} elsif ($val <0.9) {
$bin = 19;
} else {
$bin = 20;
}
if (($id{$p1}) || ($id{$p2})){
$pos[$bin]++;
} else {
}
}
for ($k=1;$k<=20;$k++) {
$bin = ($k/10)-1.05;
print "$bin\t$pos[$k]\n";
}
通过这段代码,我得到了这个(错误的)结果:
-0.9
-0.8
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1 2
0
0.1 2
0.2 2
0.3 2
0.4 1
0.5 2
0.6 3
0.7
0.8
0.9
所以,实际上我的代码只能读取第一个ID,但不考虑第二个ID。而另一个错误是,它会像在bin中看到的那样多次计算ID。 非常欢迎任何帮助!
答案 0 :(得分:3)
根据评论编辑。现在应该工作。
use strict;
use warnings;
use 5.14.0;
my %hash;
while(<DATA>){
next if /^\s*$/m; # In case if you have empty lines.
my ($key1,$key2,$val) = /^(\w)\|(\w) ([0-9.-]+)/;
$val = int($val*10)/10;
$hash{$val}{$key1}++;
$hash{$val}{$key2}++;
}
for (-9..9){
$_ = $_/10;
say "$_\t",ref $hash{$_} ? scalar keys $hash{$_} : '';
}
__DATA__
d|a -0.1412
a|a -0.1526
d|a 0.12
c|b 0.16596
b|a 0.221
c|a 0.21123
d|b 0.388
c|b 0.35
b|d 0.412
d|a 0.5236
d|c 0.565
b|a 0.6174
a|c 0.65
c|d 0.678
输出:
-0.9
-0.8
-0.7
-0.6
-0.5
-0.4
-0.3
-0.2
-0.1 2
0
0.1 4
0.2 3
0.3 3
0.4 2
0.5 3
0.6 4
0.7
0.8
0.9