LINUX.ORG.RU

агрегация списка в таблицу

 , ,


0

1

Вобщем, в скрипте циклом на выходе получаю 2 столбца - имя количество

Вася 3
Женя 4
Петя 7
Настя 4

количество - это разные типы вещей(всего их 4)

второй заход может иметь следующий вывод:

Настя 2
Вася 2
Саша 5
Гоша 4

...

и здесь уже получаю количество другой вещи.

Мне нужно всё это объединить в таблицу примерно такой структуры:

<name> <item1> <item2> <item3> <item4>

Если вручную распарсить то что я привел, то получится примерно следующее:

Вася   3   2
Настя   4   2
Саша        5
Гоша        4
Женя   4   
Петя    7

Ну и в таком духе. Сейчас я создал рабочее решение своего же вопроса с помощью mysql + PRIMARY индекса, поля - дата и имя, т.е. на одна дату - одно имя. И потом делаю сначала

INSERT INTO table (name,item1) VALUES ('Вася', 3) ON DUPLICATE KEY UPDATE item1 = 3
затем
INSERT INTO table (name,item2) VALUES ('Вася', 5) ON DUPLICATE KEY UPDATE item1 = 3

и впринципе он все это аггрегирует, но хочется все это делать ЗА базой данных, чтобы потом тупо вставить одним запросом. Как?

Ответ на: комментарий от quantum-troll

А какие входные данные должны быть?

Алгоритм получается такой: если $1 не равно name, написать тупо name val, либо принять val как val " " $2

Он будет тупо добавлять к существующему имени следующий аргумент?

leader32 ()
Ответ на: комментарий от leader32

Он будет тупо добавлять к существующему имени следующий аргумент?

Да. И из

name1 val1
name1 val2
...
nameN valN
мы получаем
name1 val1 val2
...
nameN ...
и задача решена.

quantum-troll ★★★★★ ()
Ответ на: комментарий от quantum-troll

Смотри, я создаю список

Вася 3 Женя 4 Петя 7 Настя 4 Вася 3 Женя 4

в конце специально дублирую имена. По идее, он же должен выдать вот так:

Вася 3 3 Женя 4 4 Петя 7 Настя 4

но почему-то выдает все также, как если бы я просто cat'нул список, в чем дело?

leader32 ()
Ответ на: комментарий от quantum-troll

Эээ, надо было тэги добавить, вот так: Создаю список:

Вася 3
Женя 4
Петя 7
Настя 4
Вася 3
Женя 4
В конце специально дублирую имена. По идее, он же должен выдать после прогонки вот так:
Вася 3 3
Женя 4 4
Петя 7
Настя 4

leader32 ()
Ответ на: комментарий от leader32

У меня так и выходит:
[code]
$ cat > foo.txt
Вася 3
...
^D
$ sort foo.txt | awk ...
Вася 3 3
Женя 4 4
Настя 4
Петя 7
[/code]

quantum-troll ★★★★★ ()
Ответ на: комментарий от quantum-troll

Я понял по-моему, почему не вставляет третий и другие аргументы. Я не делаю соритровку, потому что она собьет порядок, и не поймешь, к какому item относится количество. Сможешь помочь вот с этим:

как я думаю, сначала создать первый список - <name> <item> а потом циклом проверять каждую строчку первый аргемент на уникальность. Если уникален - добавлять пропущенные нули к не указанным аргументам, а затем значение <itemN>, иначе - дописывать к существующему имени кол-во <item>.

leader32 ()
$ perl -ne 'chomp;@x=split;$y{$x[0]}->[$i].=$x[1];if(!$_){$i++};if(eof){print"$_ ",join(" ",@{$y{$_}},"\n")for keys(%y)}'
Вася 3
Женя 4
Петя 7
Настя 4

Настя 2
Вася 2
Саша 5
Гоша 4
  
Настя 4 2 
Петя 7 
Вася 3 2 
Саша  5 
Гоша  4 
Женя 4 
anonymous ()
Ответ на: комментарий от anonymous

Перловка классная. Только соли мало :) Я нашел частичное решение утилитой join, но тоже не айс, в конце оставляет только те записи, у которых есть все 4 наименования:

Женя  4  3  6  8
Петя  3  4  1  6
...

А хотелось бы чтоб присутствовали и остальные записи с 0 вместо пробелов

Настя  8  0  3  5
Гоша  3  5  4  9
Толя  2  0  4  1
...
leader32 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.