【问题标题】:How to extract a json value substring with jq如何使用 jq 提取 json 值子字符串
【发布时间】:2019-08-25 21:09:41
【问题描述】:

我有这个json:

{"temperature":"21", "humidity":"12.3", "message":"Today ID 342 is running"}

我想用jq来获取这个json:

{"temp":"21", "hum":"12.3", "id":"342"}

如您所见,我要做的是提取 ID 号 342 并将其放入具有不同键名的新 json 中。我想我应该使用正则表达式,但我不知道如何在 jq 语法中插入它。

我可以使用基本命令创建另一个 json:

cat old.json | jq '{temp:.temperature,hum:.humidity, id:.message}' > new.json

我知道我可以使用方括号选择子字符串,但我不想使用它们,因为它们不考虑具有不同长度和结构的字符串。我想使用正则表达式,因为我知道 ID 号总是在“ID”部分之后。

【问题讨论】:

  • 仅供参考,使用<old.json 比使用cat old.json 更好。与jq 略有不同,但命令受益于能够使用seek()tell() 从文件的不同部分读取,跳到最后,并行线程之间的操作,在恒定时间内测量长度,或者做任何其他可以用真实文件句柄做但不能用 FIFO 做的事情,性能差异可能很大。
  • ...例如,cat foo | wc -c 会从头一直读取foo,但<foo wc -c 不会读取任何文件的内容根本,但直接跳到末尾并执行一个恒定时间的操作来请求它的当前位置。类似地,GNU sort 可以将一个巨大的文件并行排序到子进程中,每个子进程处理一个子集并将它们的结果合并在一起——但是如果给它一个管道来读取,那么读取输入的过程根本就不能并行化!

标签: json bash jq


【解决方案1】:

你说得对,正则表达式是这里的方法。幸运的是,the jq manual 有很大一部分介绍了它们的使用。

jq '
{
  temp: .temperature,
  hum: .humidity,
  id: (.message | capture("ID (?<id>[[:digit:]]+)").id)
}' <old.json >new.json

您可以在 https://jqplay.org/s/k-ZylbOC6W 上查看使用您的示例数据运行的情况

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    • 2021-02-23
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多