唯一计算两个相邻行之间的百分比差

2024-04-19 01:25:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个制表符分隔的文件,比如

Name    S.No    Points  First
Jack    2   98  F
Jones   6   25
Mike    8   11
Jasmine 5   7   
Gareth  1   85  F
Simon   4   76
Mark    11  12
Steve   17  8
Clarke  3   7

我想计算前3个点的收入者和第一个点的收入者之间的差异,用F线表示,和组中其他两个的平均值除以组中的总点数。例如,琼斯和迈克在第一个案件,西蒙和马克在第二个案件。我希望我的输出是

^{pr2}$

计算百分比的公式在输出的最后一列是,例如在琼斯的情况下,情况1是

(Jack - Jones)*100/(Jack + Jones + Mike + Jasmine)
(98-25)*100/(98+25+11+7)= 51.77

我可以使用

awk '$NF~/E/{c=3;next}c-->0'

但是,计算差额和百分比有点麻烦,因为我必须先求分母的和,然后再去掉前三行。在


Tags: 文件noname情况制表符pointsfirstmike
3条回答

以下是awk解决方案:

awk -f c.awk input.txt input.txt

其中c.awk是:

^{pr2}$

为马克得到一个完全不同的号码:

use 5.010;
use strict;
use warnings;
use autodie;
use List::Util 'sum';

open my $infile, '<', 'foo.txt';
my @groups;
my $group; 
while ( my $line = <$infile> ) {
    chomp $line;
    my ($name, $sno, $points, $first) = split /\t/, $line;
    if ( $first && $first eq 'F' ) {
        $group = [];
        push @groups, $group;
    }
    push @$group, { 'name' => $name, 'sno' => $sno, 'points' => $points, 'first' => $first };
}

say join "\t", qw/Name S.No Points First/;
for my $group (@groups) {
    my $total_points = sum map $_->{'points'}, @$group;
    my $first_points = $group->[0]{'points'};

    say join "\t", @{ $group->[0] }{ qw/name sno points first/ };

    for my $other (1..2) {
        if ( $group->[$other] ) {
            say join "\t", @{ $group->[$other] }{ qw/name sno points/ }, sprintf "%.2f", 100 * ($first_points - $group->[$other]{'points'}) / $total_points;
        }
    }
}

产生:

^{pr2}$

参考您的awk命令,似乎源文件已经按组对数据进行了排序。在

awk 'NR==FNR{if ($NF=="F") {s=$1}; a[s]+=$3;next}
     { if (FNR=="1") {print;next}
       if ($NF=="F") {s=$1;b=$3;c=3;print;next}
       if ( c>0){ printf "%s %.2f\n", $0,(b-$3)*100/a[s];}
     }' file file

结果

^{pr2}$

相关问题 更多 >