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

Исходное сообщение
"суммирование полей записей"

Отправлено dem , 27-Окт-06 23:03 
сущеествет файл с такими записями, например
123 39  223 440
123 39  40  41
123 39  201 900
710 222 2   45
710 222 611 33
710 222 21  309

на выходе надо получить, в данном случае две записи -- где первые два поля одинаковы, а третье и четвёртое просуммированы, т.е.:
123 39  223+40+201 440+41+900
710 222 2+611+21 45+33+309
суммирование по 1-му полю понятно, а по двум не допру
можно на awk,perl или shell


Содержание

Сообщения в этом обсуждении
"суммирование полей записей"
Отправлено pup , 27-Окт-06 23:51 
#!/bin/awk

{
  first = $1; second = $2;
  if (step == 0) {
     third = $3;
     fourth = $4;
     step ++;
  } else {
     third += $3;
     fourth += $4;
     if (step == 2) {
         step = 0;
         printf "%d %d %d %d\n", first, second, third, fourth;
     } else
         step ++;
  }
}


"суммирование полей записей"
Отправлено dem , 28-Окт-06 22:54 
>#!/bin/awk
>
>{
>  first = $1; second = $2;
>  if (step == 0) {
>     third = $3;
>     fourth = $4;
>     step ++;
>  } else {
>     third += $3;
>     fourth += $4;
>     if (step == 2) {
>         step = 0;
>
>         printf "%d %d
>%d %d\n", first, second, third, fourth;
>     } else
>         step ++;
>  }
>}
спасибо, но это я только показал как пример. записей может быть и тысяча, притом две записи с одними одинаковыми полями(1-е,2-е), ещё 120 с другим, а остальные 878 с третьими.


"суммирование полей записей"
Отправлено alexvs , 29-Окт-06 23:01 
#more 1.txt
123 39  223 440
123 39  40  41
123 39  201 900 232
710 222 2   45 234 2345
710 222 611 33 234 23
710 222 21  309 5 234 234 234 234

#cat 1.txt | perl -e 'my %hs; while(<>) {my @mass=split/\s/; my $key = (shift @mass)." ".(shift @mass); foreach my $val (@mass) {$hs{$key}+=$val;}} foreach my $val (sort keys %hs) {print "$val $hs{$val}\n";}'