我有20个500k行的文件,每行2个数字。 目标是获得不同对的百分比(A B)与每个A数的A数的总数。 因此,结果应该是这些文件中的A数和百分比。
例如:
1 1
1 1
1 1
1 2
应该给我1 50%(总共4 A中的2对不同)。
以下方式太慢了: 不同的数量
cat files | sort | uniq -c
总数
cat files | cut -f1 | sort | uniq -c
然后迭代这些结果并计算每个A数的百分比。
如何最好地优化查询(bash / perl)? 此外,如果仅对这些A数的子集进行此操作,如何优化它? (例如,对于20k A数,不是全部500k)
非常感谢提前
答案 0 :(得分:1)
Perl解决方案。尝试将其作为script.pl files
运行,看看速度有多快。
#!/usr/bin/perl
use warnings;
use strict;
my %hash;
while (<>) {
my @nums = split;
$hash{$nums[0]}{$nums[1]}++;
}
#for my $num (sort { $a <=> $b } keys %hash) {
for my $num (keys %hash) {
my @values = values %{ $hash{$num} };
my $sum;
$sum += $_ for @values;
my $perc = 100 * @values / $sum;
print "$num $perc%\n";
}
如果您希望输出按第一个数字排序,请取消注释sort
行(并注释以下内容)。