Форум русскоязычного сообщества Ubuntu


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

Автор Тема: AWK сумма по столбцам [РЕШЕНО]  (Прочитано 7376 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Svertal

  • Автор темы
  • Активист
  • *
  • Сообщений: 893
  • КиберПанк
    • Просмотр профиля
AWK сумма по столбцам [РЕШЕНО]
« : 20 Января 2011, 03:01:18 »
Есть файл такого вида:
Цитировать
поле1 поле2 поле3 поле4
поле1 поле2 поле3 поле4

поле1 поле2 поле3 поле4
поле1 поле2 поле3 поле4
поле1 поле2 поле3 поле4
поле1 поле2 поле3 поле4
...

поле1 поле2 поле3 поле4
поле1 поле2 поле3 поле4
поле1 поле2 поле3 поле4
Нужно посчитать сумму по столбцам, но разделенным пробелами, т.е. по каждому столбцу первого блока до пробела, затем по второму и т.д., число строк в блоках разное, число столбцов фиксированное. На выходе получить файл со входными данными и результатом, т.е.:
Цитировать
поле1 поле2 поле3 поле4
поле1 поле2 поле3 поле4
сумм1 сумм2 сумм3 сумм4
....
поле1 поле2 поле3 поле4
сумм1 сумм2 сумм3 сумм4
Первое поле каждого блока одинаково для всего блока, т.е. значение1 - для первого, значение2 - для второго, и т.д.
Не могу сообразить как сделать. В принципе не важно именно на AWK, но из консольных видимо это самое удобное.
« Последнее редактирование: 20 Января 2011, 10:03:29 от Svertal »

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: AWK сумма по столбцам
« Ответ #1 : 20 Января 2011, 07:58:58 »
yurik@yurik-pc:~$ cat test.pl
#!/usr/bin/perl

use strict;

my @res;

foreach my $line (<STDIN>) {
    chomp $line;
    next if $line eq '';
    my @nrs = split(/\s+/, $line);
    for (my $i = 0; $i < @nrs; ++$i) {
        $res[$i] += $nrs[$i];
    }
}

print join(' ', @res), "\n";

exit 0;
yurik@yurik-pc:~$ cat test.csv
1 2 3 14
14 13 8 6
yurik@yurik-pc:~$ ./test.pl < test.csv
15 15 11 20
yurik@yurik-pc:~$

Как-то так. блоки дели или просто сравнивая текущую строку с первой строкой (или, если количество пробелов может отличаться, разделяй строчку на значения и сравнивай по значениям)
« Последнее редактирование: 20 Января 2011, 08:05:00 от Yurror »

Оффлайн smaharbA

  • Участник
  • *
  • Сообщений: 220
    • Просмотр профиля
Re: AWK сумма по столбцам
« Ответ #2 : 20 Января 2011, 07:59:17 »
как то так (должно быть и просче)
echo -e '1  2  3\n4    5' | sed 's/ \s\+ / 0 /g; s/\s\+/;/g' | awk -F\; '{ for (x=0;x<NF;x++) {a[NR-1,x] = $(x+1)} } END { for (x=0;x<NF;x++) {for (y=0;y<NR;y++) { a[NR,x] += a[y,x]}; printf a[NR,x]";"}; print "" }'
5;2;8;
Я конечно далек от мысли...(с)

Оффлайн Svertal

  • Автор темы
  • Активист
  • *
  • Сообщений: 893
  • КиберПанк
    • Просмотр профиля
Re: AWK сумма по столбцам
« Ответ #3 : 20 Января 2011, 09:14:49 »
Спасибо Yurror, smaharbA.
Сейчас свой вопрос перечитал, понял что черте что наформулировал.
В общем посчитать сумму по всему столбцу я могу (и поскольку число столбцов знаю заранее то пользовался некрасивым но простым методом: awk -F';' '{a += $1} {b += $2} END {print a " " b}', варианты Yurror и smaharbA гораздо лучше, поскольку считают по всем столбцам, независимо от их количества), но проблема как раз в том чтобы по столбцу в пределах блока посчитать, т.е.
Цитата: Yurror
блоки дели или просто сравнивая текущую строку с первой строкой (или, если количество пробелов может отличаться, разделяй строчку на значения и сравнивай по значениям)
Вот, в этом суть, поблочно считать, на примере одного столбца (зря я первоначально указал несколько столбцов), блоки пустыми строками разделены, разделение столбцов не суть.
Пусть всего один столбец:
Цитировать
1
4
8

8
7
Делятся блоки всегда одной пустой строкой (это я в первом сообщении и обозвал "пробелами"). На выходе нужно получить
Цитировать
1
4
8
13
8
7
15
Блоков может быть неограниченное количество, и число строк в них разное, поэтому split на кучу файлов, чтобы отдельно посчитать, а потом обратно собрать, не получается.
P.S.:Мне надо больше спать :)

Оффлайн Yurror

  • Старожил
  • *
  • Сообщений: 1966
    • Просмотр профиля
Re: AWK сумма по столбцам
« Ответ #4 : 20 Января 2011, 09:42:40 »
Не тестил
#!/usr/bin/perl

use strict;

my @res;

foreach my $line (<STDIN>) {
    chomp $line;
    if ($line eq '') {
        print join(' ', @res), "\n";
        @res = ();
    } else {
        print $line, "\n";
    }
    my @nrs = split(/\s+/, $line);
    for (my $i = 0; $i < @nrs; ++$i) {
        $res[$i] += $nrs[$i];
    }
}

print join(' ', @res), "\n";

exit 0;

Оффлайн Svertal

  • Автор темы
  • Активист
  • *
  • Сообщений: 893
  • КиберПанк
    • Просмотр профиля
Re: AWK сумма по столбцам
« Ответ #5 : 20 Января 2011, 09:57:02 »
Yurror, то что нужно! Все работает. Огромное спасибо :)

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.