2

私は50万行のファイルを20個持っており、それぞれ1行に2つの数字があります。目標は、すべてのA番号のA番号の総数に対する異なるペア(AB)のパーセンテージを取得することです。したがって、結果はこれらのファイルからの数値とそのパーセンテージになります。

例えば:

1 1

1 1

1 1

1 2

私に150%を与えるはずです(合計4Aのうち2つの異なるペア)。

次の方法は遅すぎます:異なる数

cat files | sort | uniq -c 

総数

cat files | cut -f1 | sort | uniq -c 

次に、これらの結果を繰り返し処理し、A数あたりのパーセンテージをカウントします。

このためにクエリ(bash / perl)を最適化する方法は?また、これをこれらのA番号のサブセットに対してのみ実行する必要がある場合、それを最適化するにはどうすればよいですか?(たとえば、20k Aの数値の場合、500kすべてではありません)

よろしくお願いします

4

1 に答える 1

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出力を最初の番号でソートする場合は、行のコメントを解除します(次の行にコメントを付けます)。

于 2012-11-29T23:28:38.150 に答える