怎么编写shell语句,将数据中的某一列json格式的数据提取解析出来,并追加在对应的那条数据后面。尽量用shell语言实现,如果有其他简便方法也可以
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
335970 | 115 | 0421000841sgm6p | -13075235 | 703,160 | 0 | 703,160
335971 | 116 | 0421000666sgm6p | -12325235 | 733,144 | 1 | 333,132
使用 awk 的shelll 编程,首先定义一个数据文件 data.log
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 -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
语法说明,使用 Awk 用 | 连接输出,其中单独对 第三列再处理,最后对无用字符替换,处理逻辑如下;
{
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 的 值列
gsub(/\"/,"",$3); // 替换值的 "
gsub(/\}/,"",$3); // 替换掉右侧的 }
print
}
python 实现如下:
a='335970 | 115 | {"traceid":"0421000841sgm6p","pixeldata":-13075235,"pixelcoordinate":"703,160","pixelabnormaldata":0,"collectedpixeldata":"703,160"}'
tmp=a.split('|')
kk=eval(tmp[2])
tmp=tmp[:2]+list(kk.values())
tmp=map(str,tmp)
tmp="|".join(tmp)
print(tmp)
输出结果:
335970 | 115 |0421000841sgm6p|-13075235|703,160|0|703,160