Это вариант на Используя awk, как конвертировать даты в неделю и квартал?

Входные данные.txt:

a;2016-04-25;10;2016-w17;2016-q2
b;2016-04-25;20;2016-w17;2016-q2
c;2016-04-25;30;2016-w17;2016-q2
d;2016-04-26;40;2016-w17;2016-q2
e;2016-07-25;50;2016-w30;2016-q3
f;2016-07-25;60;2016-w30;2016-q3
g;2016-07-25;70;2016-w30;2016-q3

Требуется output.txt:

a;2016-04-25;10;2016-w17;2016-q2;50
b;2016-04-25;20;2016-w17;2016-q2;50
c;2016-04-25;30;2016-w17;2016-q2;50
d;2016-04-26;40;2016-w17;2016-q2;50
e;2016-07-25;50;2016-w30;2016-q3;180
f;2016-07-25;60;2016-w30;2016-q3;180
g;2016-07-25;70;2016-w30;2016-q3;180

Следовательно, вычислите квартальное среднее число дней, в котором есть данные, и добавьте результат.

Для 2016-го квартала среднее значение рассчитывается следующим образом:

(10+20+30+40)/2 = 50     ("2" is the number_of_unique_dates for that quarter)

За 2016-й квартал средний показатель составляет:

(50+60+70)/1 = 180

Вот моя работа в процессе, которая кажется довольно близкой к окончательному решению, но не уверен, как получить «количество уникальных дат» (столбец 2) и использовать в качестве делителя?

awk '
BEGIN { FS=OFS=";" }
NR==FNR { s[$5]+=$3; next }
{ print $0,s[$5] / need_num_of_unique_dates_here }
 ' output.txt output.txt 

Есть идеи, как получить «количество уникальных дат» за квартал?

0
Markus 28 Май 2017 в 14:52

2 ответа

Лучший ответ
$ cat tst.awk
BEGIN { FS=OFS=";" }
$5 != p5 { prt(); p5=$5 }
{ lines[++numLines]=$0; dates[$2]; sum+=$3 }
END { prt() }
function prt(   lineNr) {
    for (lineNr=1; lineNr<=numLines; lineNr++) {
        print lines[lineNr], sum/length(dates)
    }
    delete dates
    numLines = sum = 0
}

$ awk -f tst.awk file
a;2016-04-25;10;2016-w17;2016-q2;50
b;2016-04-25;20;2016-w17;2016-q2;50
c;2016-04-25;30;2016-w17;2016-q2;50
d;2016-04-26;40;2016-w17;2016-q2;50
e;2016-07-25;50;2016-w30;2016-q3;125
f;2016-07-25;60;2016-w30;2016-q3;125
g;2016-07-25;70;2016-w30;2016-q3;125
h;2016-04-01;70;2016-w30;2016-q3;125
1
Ed Morton 28 Май 2017 в 16:25

Еще одно gawk :

awk -F';' '{ a[$5][$2]+=$3; r[NR]=$0; q[NR]=$5 }
     END { 
           for (i in a) { s=0; len=length(a[i]); 
               for (j in a[i]) { s += a[i][j] } 
               a[i]["avg"] = s/len 
           } 
           for (n=1;n<=NR;n++) { print r[n],a[q[n]]["avg"] }
     }' OFS=";" file

Выход:

a;2016-04-25;10;2016-w17;2016-q2,50
b;2016-04-25;20;2016-w17;2016-q2,50
c;2016-04-25;30;2016-w17;2016-q2,50
d;2016-04-26;40;2016-w17;2016-q2,50
e;2016-07-25;50;2016-w30;2016-q3,180
f;2016-07-25;60;2016-w30;2016-q3,180
g;2016-07-25;70;2016-w30;2016-q3,180

  • a[$5][$2]+=$3 - многомерный массив, суммирующий значения для каждой уникальной даты в определенном квартале

  • len=length(a[i]) - определение количества уникальных дат в определенном квартале

  • for(j in a[i]){ s+=a[i][j] } - суммирование значений для всех дат за квартал

  • a[i]["avg"]=s/len - расчет среднего значения

1
RomanPerekhrest 29 Май 2017 в 07:49