Файлы как база данных

Программирование на sh, быть может немного про альтернативные языки
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

Файлы как база данных

Непрочитанное сообщение mmvds » 2014-03-05 17:57:28

Добрый день!
Столкнулся с такой проблемой, есть n файлов вида
Ключ 1;Ключ 2;Ключ 3;значение
нужно найти средние арифметические значений, для одинаковых ключей, отсеять значения меньше половины среднего и снова найти среднее, при этом в некоторых файлах для ключей может не быть
например, есть три файла

file1.txt
01 Feb 2014;02 Feb 2014;Alpha;168
02 Feb 2014;03 Feb 2014;Alpha;200
01 Feb 2014;02 Feb 2014;Gama;1204
02 Feb 2014;03 Feb 2014;Gama;1139

file2.txt
01 Feb 2014;02 Feb 2014;Alpha;193
02 Feb 2014;03 Feb 2014;Alpha;178
01 Feb 2014;02 Feb 2014;Beta;29
02 Feb 2014;03 Feb 2014;Beta;34
01 Feb 2014;02 Feb 2014;Gama;1354
02 Feb 2014;03 Feb 2014;Gama;1113

file3.txt
01 Feb 2014;02 Feb 2014;Alpha;172
01 Feb 2014;02 Feb 2014;Beta;35
02 Feb 2014;03 Feb 2014;Beta;40
01 Feb 2014;02 Feb 2014;Gama;44
02 Feb 2014;03 Feb 2014;Gama;1300

Итого, считаем среднее
avg.txt
01 Feb 2014;02 Feb 2014;Alpha;177
02 Feb 2014;03 Feb 2014;Alpha;189
01 Feb 2014;02 Feb 2014;Beta;32
02 Feb 2014;03 Feb 2014;Beta;37
01 Feb 2014;02 Feb 2014;Gama;867
02 Feb 2014;03 Feb 2014;Gama;1184

Выкидываем все значения, которые меньше полученного среднего/2,
такое только одно 01 Feb 2014;02 Feb 2014;Gama;44 (44 < 867/2)

Новые файлы:
file1_new.txt
01 Feb 2014;02 Feb 2014;Alpha;168
02 Feb 2014;03 Feb 2014;Alpha;200
01 Feb 2014;02 Feb 2014;Gama;1204
02 Feb 2014;03 Feb 2014;Gama;1139

file2_new.txt
01 Feb 2014;02 Feb 2014;Alpha;193
02 Feb 2014;03 Feb 2014;Alpha;178
01 Feb 2014;02 Feb 2014;Beta;29
02 Feb 2014;03 Feb 2014;Beta;34
01 Feb 2014;02 Feb 2014;Gama;1354
02 Feb 2014;03 Feb 2014;Gama;1113

file3_new.txt
01 Feb 2014;02 Feb 2014;Alpha;172
01 Feb 2014;02 Feb 2014;Beta;35
02 Feb 2014;03 Feb 2014;Beta;40
02 Feb 2014;03 Feb 2014;Gama;1300

Считаем заново средние значения:
avg_new.txt
01 Feb 2014;02 Feb 2014;Alpha;177
02 Feb 2014;03 Feb 2014;Alpha;189
01 Feb 2014;02 Feb 2014;Beta;32
02 Feb 2014;03 Feb 2014;Beta;37
01 Feb 2014;02 Feb 2014;Gama;1279
02 Feb 2014;03 Feb 2014;Gama;1184
Все

Собственно сам вопрос, есть ли способ без массивов? Возможно все как всегда решается парой строчек
Спасибо

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35426
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Re: Файлы как база данных

Непрочитанное сообщение Alex Keda » 2014-03-15 8:31:14

врятли.
думаю, awk сможет такое
Убей их всех! Бог потом рассортирует...

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Файлы как база данных

Непрочитанное сообщение kpp » 2014-05-21 12:56:17

Если еще актуально ;)
Лучше поздно, чем никогда.

Код: Выделить всё

awk -F";" '{ mass[FILENAME";"$1";"$2";"$3]=$4; sum[$1";"$2";"$3]+=$4; count[$1";"$2";"$3]++; }
           END{ for(i in sum) {
                  avg[i]=sum[i]/count[i];
                  printf "%s;%d\n", i, avg[i] > "avg.txt"
                }
                for(i in mass) {
                  split(i,fln,";");
                  split(fln[1],flname_a,".");
                  flname=flname_a[1]"_new."flname_a[2];
                  ind=fln[2]";"fln[3]";"fln[4];
                  if((avg[ind]/2) < mass[i]) {
                     sum2[ind]+=mass[i];
                     count2[ind]++;
                     printf "%s;%d\n", ind, massall[i] > flname
                  }
                }
                for(i in sum2) {
                   avg2[i]=sum2[i]/count2[i];
                   printf "%s;%d\n", i, avg2[i] > "avg_new.txt"
                }
              }' file1.txt file2.txt file3.txt
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.

mmvds
мл. сержант
Сообщения: 92
Зарегистрирован: 2011-01-26 17:24:07

Re: Файлы как база данных

Непрочитанное сообщение mmvds » 2014-05-22 21:31:30

Спасибо! Я уже сделал все посредством экспорта в БД, решил так будет работать быстрее чем через shell и массивы, да и дальнейшие преобразования оказалось гораздо проще делать запросами.
Все равно большое спасибо :)

kpp
лейтенант
Сообщения: 613
Зарегистрирован: 2009-08-05 16:10:46
Откуда: Украина Днепропетровск-Киев
Контактная информация:

Re: Файлы как база данных

Непрочитанное сообщение kpp » 2014-05-22 22:27:43

Будет ли работать быстрее через базу - не уверен, но если дальнейшая обработка\использование связаны с базой - решение верное.
В любом случае я сам слишком затянул с решением.
Семейная ситуация знаете ли, пополнение нагрянуло ;)
Нет, ребята, я не гордый. Не загадывая вдаль, так скажу: зачем мне орден? Я согласен на медаль.