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 ' ' '#'
附言:可能有一种更优化的方式来实现这一点。欢迎评论!