URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8191
[ Назад ]

Исходное сообщение
"Суммирование значений столбца и среднее арифметическое"

Отправлено visitor , 03-Апр-09 21:15 
Здравствуйте.
Ребята никак не получается написать скрипт, помогите плиз.

Имею таблицу:
STRING-001,63,8,54
STRING-001,11,3,6
STRING-001,11,3,4
STRING-001,50,13,31
STRING-003,3,2,11
STRING-003,3,2,1
STRING-004,3,2,4
STRING-004,3,2,2
STRING-004,2,2,3
STRING-004,3,2,6
STRING-004,1,1,8

Необходимо просуммировать значения 2-го, 3-го, 4-го столбца с вычислением их средне-арифметического значения. На выходе нужно иметь:

STRING-001 33,75 6,75 23,75
STRING-003 3 2 6
STRING-004 2,4 1,8 4,8

Буду признателен подсказке по реализации любыми средствами кроме SQL, но лучше на sh+awk+sed

Заранее спасибо.


Содержание

Сообщения в этом обсуждении
"Суммирование значений столбца и среднее арифметическое"
Отправлено NuINu , 03-Апр-09 22:07 
>[оверквотинг удален]
>На выходе нужно иметь:
>
>STRING-001 33,75 6,75 23,75
>STRING-003 3 2 6
>STRING-004 2,4 1,8 4,8
>
>Буду признателен подсказке по реализации любыми средствами кроме SQL, но лучше на
>sh+awk+sed
>
>Заранее спасибо.

Вот как бы сделал я
#!/usr/bin/perl -w

use strict;

my %stat;
while(<DATA>) {
    chomp;
    my @tmp = split(/,/, $_);
    if(!defined($stat{$tmp[0]})) {
    $stat{$tmp[0]} = [0, 0, 0, 0];    #формат: количество элементов, сумма 1 столбца, сумма 2, сумма 3
    }
    $stat{$tmp[0]}->[0] += 1;
    foreach my $i (1..3) {
    $stat{$tmp[0]}->[$i] += $tmp[$i];
    }
}


    #Результ
foreach my $k (sort keys(%stat)) {
    print "$k ";
    foreach my $i (1..3) {
    print $stat{$k}->[$i]/$stat{$k}->[0], " ";
    }
    print "\n";

}

__DATA__
STRING-001,63,8,54
STRING-001,11,3,6
STRING-001,11,3,4
STRING-001,50,13,31
STRING-003,3,2,11
STRING-003,3,2,1
STRING-004,3,2,4
STRING-004,3,2,2
STRING-004,2,2,3
STRING-004,3,2,6
STRING-004,1,1,8

но если ты желаешь исполнить это на седе шеле и авке то тебе придеться поискать кого нибудь другого или сделать это самому.


"Суммирование значений столбца и среднее арифметическое"
Отправлено visitor , 03-Апр-09 22:15 
спасибо большое.
но все таки хочется на седе и авке :)
там не будет таких громоздких циклов

"Суммирование значений столбца и среднее арифметическое"
Отправлено angra , 04-Апр-09 00:28 
Какие мы привередливые. Вот вам вариант без громоздких циклов.
perl -F, -ane '$h{$F[0]}->[$_]+=$F[$_] for 1..3;$h{$F[0]}->[0]++;END{for $k(sort keys %h) {print "$k";print " ".($h{$k}->[$_]/$h{$k}->[0]) for 1..3;print "\n";}}'
Можно сделать еще компактней. На awk будет выглядеть похоже.