大数据中的报文一般以文件形式存放。比如这样:
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.sh
elif [ $# -eq 2 ] ;
then
type=$1
codeline=$2
#读配置文件,通过type找想要的配置
scount=`cat /home/hadoop/bin/turndo/census/mesConstruts.conf |grep '|'$type'|' |wc -l`
if [ $scount != 0 ] ;
then
nameline=`cat /home/hadoop/bin/turndo/census/mesConstruts.conf |grep '|'$type'|'`
#将报文本身和数据字典都以竖线分割
names=(${nameline//|/ })
codes=(${codeline//|/ })
label="`echo $nameline |cut -d '|' -f 3`"
echo $label
xh=0
nm=0
len=${#names[@]}
len=`expr $len - 3`;
for name in "${names[@]}";
do
nm=`expr $nm + 1`;
if [ $nm -gt 2 ] && [ $xh -lt $len ] ;
then
i=`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 ] ;
then
code="[got no value]"
fi
if [ $namelen -lt 1 ] ;
then
aname="LOSS BLANK"
fi
echo $xh ${aname} ":" "${code}"
xh=`expr $xh + 1`;
fi
done
fi
fi
}
写完别忘了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;
do
fname=`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 $len
len=`expr length "$echoline"`
if [ $len -gt 30 ];
then
echo ${echoline#*,}
echoline=""
fi
last_fid=$fid
done
echo ${echoline#*,}