大数据报文对数工具

大数据中的报文一般以文件形式存放。比如这样:

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#*,}



你可能感兴趣的:(Linux,大数据,shell,编码,数据)