awk处理案例二十四--一个复杂的sql
原帖http://www.itpub.net/thread-1835425-1-2.html
【场景】
insert into test values('a','20131213','EQ',131313,333333)
insert into test values('a','20131216','EQ',161616,666666)
insert into test values('a','20131217','EQ',171717,777777)
insert into test values('c','20131218','EQ',181818,888888)
insert into test values('c','20131219','EQ',191919,999999)
insert into test values('e','20131220','EQ',202020,222222)
insert into test values('f','20131223','FI',234324,123213)
insert into test values('g','20131224','FI',242424,444444)
insert into test values('g','20131225','FI',252525,555555)
calculate: (quantity(t)+cashflow(t)-quantity(t-1))/quantity(t-1) depend on the entity,entity_type,effectivedate
t:指effectivedate,t-1:指前一天(需要判断是否工作日,即如果 t是周一 则t-1就是上周五)
如果quantity(t-1)没有数,则不需要计算
结果应该只有四条记录:
entity entity_type effectivedate result
a EQ 20131216 666666+161616-333333/333333
a EQ 20131217 777777+171717-666666/666666
c EQ 20131219 999999+191919-888888/888888
g FI 20131225 555555+252525-444444/444444
【代码】--我用awk来实现
> awk -F"," 'FNR>1{getline d < "lottu11";split(d,a,",");if($1==a[1])print $1,$3,$2,($4+$5-a[5])/a[5]}' lottu11 a EQ 20131216 1.48485 a EQ 20131217 0.424242 c EQ 20131219 0.340909 g FI 20131225 0.818182 > cat lottu11 a,20131213,EQ,131313,333333 a,20131216,EQ,161616,666666 a,20131217,EQ,171717,777777 c,20131218,EQ,181818,888888 c,20131219,EQ,191919,999999 e,20131220,EQ,202020,222222 f,20131223,FI,234324,123213 g,20131224,FI,242424,444444 g,20131225,FI,252525,555555
【解析】
首先我想到是利用数组,建一个二维数组,a[i,$1];其中i表示$1是第几次出现;想了下,这样实现的话,代码是比较长!
所以想到用这样来实现就比较简单;例如一行是这样的,就很容易能实现了;所以采用getline的用法。
a,20131216,EQ,161616,666666 a,20131213,EQ,131313,333333

浙公网安备 33010602011771号