大数据报文对数工具
大数据中的报文一般以文件形式存放。比如这样:
AAA|BBBB|123|123|1|2|3|CCC|DDDD|2017-02-01
字段间用竖线分割,这些字段是有实际意义的。在对数时,很难一眼看出某个想要的字段在哪里。
为了方便追查问题,我写了个对数工具,可以从shell里直接把报文对号入座。
首先准备一个配置文件:
/home/hadoop/bin/turndo/census/mesConstruts.conf
内容如下,想对一种数就在里面配置一行。
6|sjxx|收寄信息|邮件ID|邮件条码|邮件号码|邮件种类代码|收寄局代码|寄达局代码|行政区划|邮件备注|收件人手机号码|收件人名字|收件人地址|收件人邮编|寄件人手机号码|寄件人名字|寄件人地址|寄件人邮编|邮件重量|邮件体积|邮件资费|投递段|投递顺序|第一开拆局|大宗编号|内件信息|进口接口时间|收寄日期|收寄来源|收寄局标志|收寄县市代码|收寄地市代码|收寄省份代码|收寄频次|收寄频次截止时刻|收寄频次第几日|收寄单位属性|收寄频次市趟运行时长|寄达局县市|寄达局地市|寄达局省份|寄达局标志|预计市趟进中心局时间
35|sjfjlzjb|上机分拣量第一步|邮件条码|所属省|所属地市|所属县市|所属局代码|进出口标志|收寄单位属性|扫描时间|邮件种类|扫描状态|扫描类型|发送时间|发送标志|车间代码|班次代码|台席代码|操作员代码
注意保存的编码格式要和linux系统默认编码格式一样
在/home/hadoop/.bashrc 中 alias一个新的命令:
alias transm=translate
translate(){if [ $# -eq 0 ] ;then#声明都能对哪些数sh /home/hadoop/bin/turndo/census/echo-transm.shelif [ $# -eq 2 ] ;thentype=$1codeline=$2#读配置文件,通过type找想要的配置scount=`cat /home/hadoop/bin/turndo/census/mesConstruts.conf |grep '|'$type'|' |wc -l` if [ $scount != 0 ] ;thennameline=`cat /home/hadoop/bin/turndo/census/mesConstruts.conf |grep '|'$type'|'`#将报文本身和数据字典都以竖线分割names=(${nameline//|/ }) codes=(${codeline//|/ })label="`echo $nameline |cut -d '|' -f 3`"echo $labelxh=0nm=0len=${#names[@]}len=`expr $len - 3`;for name in "${names[@]}";donm=`expr $nm + 1`;if [ $nm -gt 2 ] && [ $xh -lt $len ] ;theni=`expr $xh + 1`;k=`expr $xh + 4`;code=`echo $2 |cut -d '|' -f $i`aname="`echo $nameline |cut -d '|' -f $k`"namelen=`echo $aname |awk -F "" '{print NF}'`codelen=`echo $code |awk -F "" '{print NF}'`if [ $codelen -lt 1 ] ;thencode="[got no value]"fiif [ $namelen -lt 1 ] ;thenaname="LOSS BLANK"fiecho $xh ${aname} ":" "${code}"xh=`expr $xh + 1`;fidonefifi
}
写完别忘了source .bashrc
使用时直接敲击命令transm sjxx "你的报文" (这个双引号是必须的加,不然不它认为这是一个参数)实际效果像这样:
声明能对哪些数那里没什么技术含量,加了个自动换行,但效果不怎么好:
/home/hadoop/bin/turndo/census/echo-transm.sh
confcount=`cat /home/hadoop/bin/turndo/census/mesConstruts.conf |wc -l`namefile=`cat /home/hadoop/bin/turndo/census/mesConstruts.conf`
i=1
last_fid=""
echoline=""
for line in $namefile;
dofname=`echo $line |cut -d '|' -f 3`fid=`echo $line |cut -d '|' -f 2`i=`expr $i + 1`;echoline=$echoline", "$fname"("$fid")"#len=`echo $echoline|awk '{print length($0)}'`#echo $lenlen=`expr length "$echoline"`if [ $len -gt 30 ];thenecho ${echoline#*,}echoline=""filast_fid=$fid
done
echo ${echoline#*,}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
