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

Исходное сообщение
"sh - сгруппировать записи в файле"

Отправлено fics , 14-Сен-09 21:41 
Добрый вечер. Подскажите кто в курсе дела.
Имеентся файл вида:

файл №1
код товара | cумма | дата
1 10 20090914
2 20 20090914
3 30 20090914
1 10 20090921
1 10 20090914
2 20 20090914

нужно обработать файл №1 и получить результат вида:
1 20 20090914
1 10 20090921
2 40 20090914
3 30 20090914


Вобщем если бы файл №1 представлял собой таблицу БД, то
это можно было бы сделать при поможи простого запроса:
select cod_tovara, sum(summa), p_data from file_1 group by cod_tovata, p_data
Так вот вопрос: нет ли стандартной команды? такой я не нашел.
Как быть, циклами на awk "собрать" не проблем или есть способ лучьше?


Содержание

Сообщения в этом обсуждении
"sh - сгруппировать записи в файле"
Отправлено DearFriend , 14-Сен-09 23:02 
cat filename | sort | uniq

"sh - сгруппировать записи в файле"
Отправлено Slavaz , 14-Сен-09 23:09 
>Вобщем если бы файл №1 представлял собой таблицу БД, то
>это можно было бы сделать при поможи простого запроса:
>select cod_tovara, sum(summa), p_data from file_1 group by cod_tovata, p_data
>Так вот вопрос: нет ли стандартной команды? такой я не нашел.
>Как быть, циклами на awk "собрать" не проблем или есть способ лучьше?

Наверное, тут только awk или perl. Чтобы работать как с SQL, можно либо unixODBC понять (пушкой по воробьям, но зато непосредственно работа через SQL с текстовым файлом);

Либо конвертнуть файл в sqlite и потом работать с данными через SQL-запросы. Например, так:

#!/bin/sh
sqlite3 test.sq3 'create table file_1 (cod_tovara int, summa int, p_data timestamp)'
sqlite3 test.sq3 "$(grep -P '^\d' text.txt | awk '{print "insert into file_1 values ("$1","$2","$3");"}')"

ну и дальше уже приведенной Вами командой выгребаем нужные данные:
sqlite3 test.sq3 "select cod_tovara, sum(summa), p_data from file_1 group by cod_tovara, p_data"


"sh - сгруппировать записи в файле"
Отправлено fics , 15-Сен-09 00:06 
да это сильно уже замудрено в sqllite... Я просто имел введу, что есть, к примеру, команда join для склеивания, почти аналогичная sql-ой и может есть для такой задачи как в вопросе, а так да: uniq - c, получили количесво - повторный проходом  
awk '{$kol_vo*$sum}' > file


"sh - сгруппировать записи в файле"
Отправлено fics , 15-Сен-09 00:08 
>> можно либо unixODBC понять (пушкой по воробьям, но зато непосредственно работа через SQL с текстовым файлом);

Ага круто вы взяли, если бы я понял, уже сменил бы работу


"sh - сгруппировать записи в файле"
Отправлено Slavaz , 15-Сен-09 01:24 
>>> можно либо unixODBC понять (пушкой по воробьям, но зато непосредственно работа через SQL с текстовым файлом);
>Ага круто вы взяли, если бы я понял, уже сменил бы работу

- можно либо unixODBC понять
+ можно либо unixODBC поднять

Извините, ошибся. :)

> да это сильно уже замудрено в sqllite...

да нет. Две команды: первая создаёт БД, вторая команда - вкачивает данные. И дальнейшая работа с данными происходит через SQL-запросы. Сделать скрипт, "обвязывающий" данные SQLем - как два пальца :) Фактически, в предыдущем посту я уже написал скрипт.

>>> Вобщем если бы файл №1 представлял собой таблицу БД, то
>>> это можно было бы сделать при поможи простого запроса:
>>> select cod_tovara, sum(summa), p_data from file_1 group by cod_tovata, p_data

Это предложение я воспринял как условие задачи: "по-возможности, работать данными через SQL-команды". Если неправильно понял - сорри.


"sh - сгруппировать записи в файле"
Отправлено phpcoder , 15-Сен-09 09:31 
coder@proger-ub5 ~ $ sort -n -k1,3 data.txt | uniq -c | awk '{printf("%d %d %d\n", $2, $1*$3, $4)}'
1 20 20090914
1 10 20090921
2 40 20090914
3 30 20090914


"sh - сгруппировать записи в файле"
Отправлено fics , 15-Сен-09 13:46 
>coder@proger-ub5 ~ $ sort -n -k1,3 data.txt | uniq -c | awk
>'{printf("%d %d %d\n", $2, $1*$3, $4)}'
>1 20 20090914
>1 10 20090921
>2 40 20090914
>3 30 20090914

Это если суммы одинаковые, а если
1 10.9 20090921
да решил я свой вопрос, хотел просто за команду такую узнать и все.
Спасибо.