当前位置: 首页 > news >正文

将一列json_如何用 awk 命令提取 JSON 数据的值列

题记

笔者是一位 Java 程序员,以前在号称中国最大的程序员网站 CSDN 上写博客,今年6月开始,才发现头条号这个宝藏,然后将写作平台扩充到这里。本文是一篇旧文,介绍一个简单的 Linux 应用,带您体验 awk 丰富的编程功能。

背景

玩了一下 awk 的数据库处理过程,将数据中的某一列 json 格式的数据提取解析出来,并追加在对应的那条数据后面,用 | 分割输出。原始数据格式为:

335970 | 115 | {"key1":value,"key2":value}

输出:

335970 | 115 |0421000841sgm6p|-13075235|703,160|0|703,160

实现分析

首先,定义一个数据文件 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 真神奇,可以写很长的逻辑来处理。

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

执行命令:

499d7494c667fbe3c2f1b6d84373643b.png

执行结果

处理过程分析

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 的 值列,下标是 2   gsub(/"/,"",$3); // 替换值的 "   gsub(/}/,"",$3); // 替换掉右侧的 }   print }

这里,如果没有 gsub 替换逻辑,输出的信息带着 JSON 的引号和括号:

870bc497044dc78b5610ff86cc8bfeee.png

未截取时的问题

升级处理

如果 JSON 的 key 顺序是不确定的,怎么能保证输出的值是按固定的顺序拼接出来的呢?这里可以改造处理的逻辑,遍历 key-value 的数据,根据 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

编程启示录

awk 命令中能写很长的处理逻辑,真是太强大了,这里有几个注意点:

  1. -vOFS="|" 指定输出拼接符号为 | ;
  2. 处理逻辑中的数组下标是从 1 开始的,这点跟常规的编程规范不一样;
  3. 拼接 JSON 值的时候,第一个值不需要 | 连接符,因为 awk 自己带着连接符了;
  4. 对最终结果剔除无用字符,用 gsub 全局替换,需要去掉 "} ,它们都是处理逻辑关键字, 必须进行转义
  5. 最后一句的 print 是直接输出 awk 的结果。
  6. 优化后的操作,处理 JSON 之前先删掉无用的字符后,再解析。

相关文章:

  • 数据仓库 桥接表_数据仓库-维度处理-读书笔记(四)
  • 装完nvme固态经常蓝屏_方案解决:NVMe SSD安装Win7蓝屏0x0000007B快速解决方案
  • 上的img表示什么_html元素img之间会有空隙的原因以及如何消除
  • netty代理转发_lemon: 基于Netty的微服务网关,实现Dubbo、HTTP等代理转发!
  • mysql自动备份快结束很卡_mysql备份慢以及自动重启问题——调整NUMA
  • mysql 数据库表属性默认_【学习之Mysql数据库】mysql数据库创建表的属性详解
  • perl mysql utf8_mysql – Perl字符串操作和utf8 / unicode
  • docker redis mysql_Docker安装常用组件(mysql,redis)的方法
  • mysql 检查约束 替代_MySQL检查约束
  • mysql触发器修改表分区_MySQL 触发器例子(两张表同步增加和删除)
  • mysql索引性能极具下降_性能优化之mysql索引优化
  • mysql keepalived6_MySQL+Keepalived实现主主高可用方案
  • python install package_python install package作为另一个包的子包
  • 易语言 excel_易语言初级教程-将图片转化为excel像素画
  • PHP启动mysql时出现路径_MySQL数据库改路径后没办法启动的问题
  • 2019年如何成为全栈工程师?
  • centos安装java运行环境jdk+tomcat
  • CSS3 聊天气泡框以及 inherit、currentColor 关键字
  • Markdown 语法简单说明
  • mysql 数据库四种事务隔离级别
  • nfs客户端进程变D,延伸linux的lock
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 从0到1:PostCSS 插件开发最佳实践
  • 对话 CTO〡听神策数据 CTO 曹犟描绘数据分析行业的无限可能
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 异常机制详解
  • 赢得Docker挑战最佳实践
  • 栈实现走出迷宫(C++)
  • 转载:[译] 内容加速黑科技趣谈
  • 大数据全解:定义、价值及挑战
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • ###C语言程序设计-----C语言学习(3)#
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • (6)STL算法之转换
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (Python第六天)文件处理
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (二)Pytorch快速搭建神经网络模型实现气温预测回归(代码+详细注解)
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (未解决)macOS matplotlib 中文是方框
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • 、写入Shellcode到注册表上线
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .net redis定时_一场由fork引发的超时,让我们重新探讨了Redis的抖动问题
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .Net面试题4
  • .Net中间语言BeforeFieldInit
  • ::什么意思
  • @Bean注解详解
  • @converter 只能用mysql吗_python-MySQLConverter对象没有mysql-connector属性’...
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • [ linux ] linux 命令英文全称及解释
  • [51nod1610]路径计数