使用 jq 实用程序解析 json 并一起附加字段



json块数组中的数千个json块中的一个如下所示-

{
  "id": 4409976,
  "name": "MKLIU",
  "version": "1.0",
  "package_type": "generic",
  "status": "default",
  "_links": {
    "web_path": "/part1/part2/ONEMTH/part4/-/part5/part6",
    "delete_api_path": "https://example.com/api/v1/part40/part90/part65/part73"
  },
  "created_at": "2019-01-02T10:52:34.857Z",
  "project_id": 667845,
  "project_path": "hereitis/downloads/ONEMTH/MKLIU",
  "tags": []
}

我希望使用jq实用程序在Ubuntu命令行上解析json块的数组

预期输出

667845#MKLIU#ONEMTH

到目前为止,我写的代码如下

curl <some url> | jq -r '.[] | [.project_id, .name, ._links.web_path] | join("#")'

我不知道如何从._links.web_path 中只取出零件ONEMTH

也可以使用json块中的project_path字段来解析值。

我可以请求一些指导吗?

关键是对分隔符(/(使用split/1方法,并通过指定索引提取所需的字段

[ .project_id, .name, (._links.web_path | split("/")[3]) ] | join("#")

jqplay-工作演示

对于您显示的一个对象,它对应于.[]之后的代码:您可以使用字符串插值和split/数组索引来提取web路径字符串:

jq -r '"(.project_id)#(.name)#(._links.web_path | split("/")[3])"'

使用可以实现这一点

$ jq '{ project_id, name, "path": ._links.web_path | split("/") | .[3] } | join ("#")' < example.txt
"667845#MKLIU#ONEMTH"

CCD_ 8和CCD_;通过";从输入。您没有指定从_links.web_path键中提取目标子字符串"ONEMTH"的确切规则。以上假设它始终是"/"上的字符串拆分后的第四个元素。如果情况并非总是如此,请更新您的问题。

然后,数据被收集到一个对象中,而不是数组中,并且值由"#"字符连接。

有趣的是,在这里使用数组似乎不起作用:

$ jq '[.project_id, .name, ._links.web_path | split("/") | .[3]] | join ("#")' < example.txt
jq: error (at <stdin>:14): split input and separator must be strings

我不知道为什么。jq文档明确指出,数组元素可能是管道,所以看起来应该没问题。但无论如何,前者是有效的!

您可以使用以下内容来获得所需的输出。

echo $(curl <some-url> | jq -r '.[] | [.project_id, .name] | join("#")' && curl <some-url> | jq -r '.[] |  ._links.web_path' | awk -F/ '{ print $4}') | tr ' ' '#'

附言:可能有一种更优化的方式来实现这一点。欢迎评论!

相关内容

最新更新