玩了一下 awk 的数据库处理过程,将数据中的某一列 json 格式的数据提取解析出来,并追加在对应的那条数据后面,用 | 分割输出。原始数据格式为:数据库
335970 | 115 | {"key1":value,"key2":value}
复制代码
输出:编程
335970 | 115 |0421000841sgm6p|-13075235|703,160|0|703,160
复制代码
首先,定义一个数据文件 data.log,文件内容以下:json
335970 | 115 | {"traceid":"0421000841sgm6p","pixeldata":-13075235,"pixelcoordinate":"703,160","pixelabnormaldata":0,"collectedpixeldata":"703,160"}
335971 | 116 | {"traceid":"0421000666sgm6p","pixeldata":-12325235,"pixelcoordinate":"733,144","pixelabnormaldata":1,"collectedpixeldata":"333,132 复制代码
编写处理命令,用 | 分割,并用 | 拼接后输出,这里着重要对第三列的数据再处理,awk 真神奇,能够写很长的逻辑来处理。数组
awk -F "|" -vOFS="|" '{l=split($3,arr,",\"");$3="";for(i=1;i<=l;i++){ll=split(arr[i],arr2,":"); if(i!=1)$3=$3"|";$3=$3arr2[2]} ;gsub(/\"/,"",$3);gsub(/\}/,"",$3);print }' ./data.log
复制代码
执行命令: bash
awk 不太好的一点,就是不能对处理过程进行格式化,致使命令很长不太好读,这里拆解分析处理过程:ui
{
l=split($3,arr,",\""); // 对第三列用 ," 分割,获得 JSON 的 key-value $3=""; // 初始化第三列 for(i=1;i<=l;i++){ // 遍历第三列的分割的 JSON 属性对 ll=split(arr[i],arr2,":"); // 再对每个 key-value 用: 分割 if(i!=1)$3=$3"|"; // 非第一个 key-value 的时候,须要链接符号 | $3=$3arr2[2]} ; // 拼接新的第三例,只取JSON 的 值列,下标是 2 gsub(/\"/,"",$3); // 替换值的 "
gsub(/\}/,"",$3); // 替换掉右侧的 }
print
}
复制代码
这里,若是没有 gsub
替换逻辑,输出的信息带着 JSON 的引号和括号: spa
awk 命令中能写很长的处理逻辑,真是太强大了,这里有几个注意点:3d
-vOFS="|"
指定输出拼接符号为 | ;1
开始的,这点跟常规的编程规范不同;gsub
全局替换,须要去掉 "
和 }
,它们都是处理逻辑关键字, 必须进行转义;print
是直接输出 awk 的结果。