Здравствуйте.
Ребята никак не получается написать скрипт, помогите плиз.Имею таблицу:
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
Заранее спасибо.
>[оверквотинг удален]
>На выходе нужно иметь:
>
>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 -wuse 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но если ты желаешь исполнить это на седе шеле и авке то тебе придеться поискать кого нибудь другого или сделать это самому.
спасибо большое.
но все таки хочется на седе и авке :)
там не будет таких громоздких циклов
Какие мы привередливые. Вот вам вариант без громоздких циклов.
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 будет выглядеть похоже.