我是该网站的新手,具有有限的脚本技能,但能够毫无问题地通过脚本选择我的方式。 我想编写一个脚本来实时监控通过大量日志文件传来的FIX消息;按帐户和符号。费率需要按分钟计算。目前我不确定这是一分钟计算还是滚动60秒计算。 我还没有写任何东西,我只是想看看这是否可行,是否有人可以给我一些关于什么是最好的脚本语言的指示。 感谢
答案 0 :(得分:0)
这是一个残酷的解决方案。如果行上有35 = D,我们使用正则表达式来分割有趣的部分,时间戳(没有秒,因此条目落入分钟级别的等价类),以及两个标记并将其转储为“多维”数组,意思是我们使用这些作为数组的索引。一旦我们浏览了所有消息,我们就会按照特定的顺序扫描数组,然后转储计数器。它非常丑陋......三个'匹配'函数应该写成一个,也许输出排序,但这在shell中的'sort'是微不足道的。
#!/usr/bin/awk -f
#Out_Vec__PWKBVSP-LE2__0 [ 601] : timestamp=2013-08-12-13:00:01.235605858 :: latency=1323.3460000000 :: 8=FIX.4.4|9=0253|35=D|34=0000601|52=20130812-13:00:01.235|49=SENDER|56=RECEIVER|57=SOR|50=TRADER|128=SPSE|11=ORDERID1|453=3|448=16|447=D|452=7|448=DMA1|447=D|452=54|448=ABC|447=D|452=36|1=ACCOUNT123|55=LPSB3|54=1|60=20130812-13:00:00.000|38=6400|40=2|44=17.8700|15=BRL|59=0|10=010| :: aux_len=0,
/35=D/ {
n=match($0, /.*\|1=([^\|]+)\|.*/, tmp1);
n=match($0, /.*\|55=([^\|]+)\|.*/, tmp2);
n=match($0, /[^:]+: timestamp=([[:digit:]]+)-([[:digit:]]+)-([[:digit:]]+)-([[:digit:]]+):([[:digit:]]+).*/, ts);
# print tmp1[1], tmp2[1], ts[1], ts[2], ts[3], ts[4], ts[5];
aggr[tmp1[1], tmp2[1], ts[1], ts[2], ts[3], ts[4], ts[5]]++;
}
END {
for (i in aggr)
print i, aggr[i];
}
对于我得到的样本:
ACCOUNT123PSSA3201308121301 3
ACCOUNT123CPFE3201308121301 1
ACCOUNT123LPSB3201308121300 1
ACCOUNT123GETI4201308121301 1
可以进一步处理。