杨先森的博客 2020-05-15 11:00 采纳率: 50%
浏览 407
已采纳

如何通过shell语句解析某一列的json并输出里面字段

怎么编写shell语句,将数据中的某一列json格式的数据提取解析出来,json里面数据的顺序不固定,需要按照第一条那样的顺序输出,并追加在对应的那条数据后面。尽量用shell语言实现,如果有其他简便方法也可以

原始数据内容如下:
335970 | 115 | {"traceid":"0421000841sgm6p","pixeldata":-13075235,"pixelcoordinate":"703,160","pixelabnormaldata":0,"collectedpixeldata":"703,160"}

335971 | 116 | {"pixeldata":"-12325235","traceid":0421000666sgm6p,"pixelcoordinate":"733,144","pixelabnormaldata":1,"collectedpixeldata":"333,132"}

335972 | 117 | {"pixelabnormaldata":"0","traceid":0231000666sgm6p,"pixelcoordinate":"723,124","pixeldata":-12325235,"collectedpixeldata":"333,132"}

结果数据:
335970 | 115 | 0421000841sgm6p | -13075235 | 703,160 | 0 | 703,160

335971 | 116 | 0421000666sgm6p | -12325235 | 733,144 | 1 | 333,132

335972 | 117 | 0231000666sgm6p | -12325235 | 723,124 | 0 | 333,132

  • 写回答

2条回答 默认 最新

  • 毕小宝 博客专家认证 2020-05-15 14:13
    关注

    使用命令:

    awk -F "|"  -vOFS="|"  '{l=split($3,arr,",\"");$3="";traceid="";pixeldata=0;pixelcoordinate="";pixelabnormaldata="";collectedpixeldata="";for(i=1;i<=l;i++){gsub(/ /,"",arr[i]);gsub(/\"/,"",arr[i]);gsub(/\}/,"",arr[i]);gsub(/\{/,"",arr[i]);ll=split(arr[i],arr2,":"); if(arr2[1]=="traceid") traceid=arr2[2];if(arr2[1]=="pixeldata") pixeldata=arr2[2];if(arr2[1]=="pixelcoordinate") pixelcoordinate=arr2[2];if(arr2[1]=="pixelabnormaldata") pixelabnormaldata=arr2[2];if(arr2[1]=="collectedpixeldata") collectedpixeldata=arr2[2];} ;$3=traceid"|"pixeldata"|"pixelcoordinate"|"pixelabnormaldata"|"collectedpixeldata;print}' ./data.log
    

    执行结果为:
    图片说明

    过程分解:主要就是在循环之前,对字符串替换掉无用字符;然后对二次拆分的 key 比对,得到各个 key 的值,最后按顺序拼接起来就可以了。

    awk -F "|"  -vOFS="|"  '{l=split($3,arr,",\"");
    $3="";
    traceid="";
    pixeldata=0;
    pixelcoordinate="";
    pixelabnormaldata="";
    collectedpixeldata="";
    for(i=1;i<=l;i++){
    gsub(/ /,"",arr[i]);gsub(/\"/,"",arr[i]);gsub(/\}/,"",arr[i]);gsub(/\{/,"",arr[i]);
    ll=split(arr[i],arr2,":"); 
    if(arr2[1]=="traceid") traceid=arr2[2];
    if(arr2[1]=="pixeldata") pixeldata=arr2[2];
    if(arr2[1]=="pixelcoordinate") pixelcoordinate=arr2[2];
    if(arr2[1]=="pixelabnormaldata") pixelabnormaldata=arr2[2];
    if(arr2[1]=="collectedpixeldata") collectedpixeldata=arr2[2];
    } ;$3=traceid"|"pixeldata"|"pixelcoordinate"|"pixelabnormaldata"|"collectedpixeldata;print}' ./data.log
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 计算二重积分∫∫e^(x+y)dxdy,其中0≤x≤1,0≤y≤1,试分别用复合辛普森公式(取n=4)以及高斯求积公式(取n=4)计算积分 给出matlab程序
  • ¥15 opencv 无法读取视频
  • ¥15 用matlab 实现通信仿真
  • ¥15 按键修改电子时钟,C51单片机
  • ¥60 Java中实现如何实现张量类,并用于图像处理(不运用其他科学计算库和图像处理库))
  • ¥20 5037端口被adb自己占了
  • ¥15 python:excel数据写入多个对应word文档
  • ¥60 全一数分解素因子和素数循环节位数
  • ¥15 ffmpeg如何安装到虚拟环境
  • ¥188 寻找能做王者评分提取的