Страница 1 из 1

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

Добавлено: 2014-03-05 17:57:28
mmvds
Добрый день!
Столкнулся с такой проблемой, есть 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
Все

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

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

Добавлено: 2014-03-15 8:31:14
Alex Keda
врятли.
думаю, awk сможет такое

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

Добавлено: 2014-05-21 12:56:17
kpp
Если еще актуально ;)
Лучше поздно, чем никогда.

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

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

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

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

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

Добавлено: 2014-05-22 22:27:43
kpp
Будет ли работать быстрее через базу - не уверен, но если дальнейшая обработка\использование связаны с базой - решение верное.
В любом случае я сам слишком затянул с решением.
Семейная ситуация знаете ли, пополнение нагрянуло ;)