【发布时间】:2019-04-08 22:52:35
【问题描述】:
假设我们有这个文件:
{
"persons": [
{
"friends": 4,
"phoneNumber": 123456,
"personID": 11111
},
{
"friends": 2057,
"phoneNumber": 432100,
"personID": 22222
},
{
"friends": 50,
"phoneNumber": 147258,
"personID": 55555
}
]
}
我现在想将11111、22222、33333、44444 和 55555 的电话号码提取为分号分隔的字符串:
123456;432100;;;147258
运行时
cat persons.txt | jq ".persons[] | select(.personID==<ID>) | .phoneNumber"
每个<ID> 一次,然后将结果与; 粘合在一起,这非常慢,因为它必须为每个 ID(以及我要提取的其他字段)重新加载文件。
在单个查询中连接它:
cat persons.txt | jq "(.persons[] | select(.personID==11111) | .phoneNumber), (.persons[] | select(.personID==22222) | .phoneNumber), (.persons[] | select(.personID==33333) | .phoneNumber), (.persons[] | select(.personID==44444) | .phoneNumber), (.persons[] | select(.personID==55555) | .phoneNumber)"
这也有效,但它给出了
123456
432100
147258
所以我不知道缺少哪些字段以及我必须插入多少个;。
【问题讨论】:
-
数字之间是否需要一个分号?我在你的问题中看到你写了'123456;432100;;;147258' 为什么最后一个数字前面有3个分号?
-
是的,因为我在寻找
11111、22222、33333、44444和55555,但33333和44444没有出现在文件中因此是无效的。如果我只有一个;,我无法保证正确的数字在正确的列中。 -
这很恶心,不是你要问的,但它可能会激发一些人:
. as $input | [11111, 22222, 33333, 44444, 55555][] | (. as $id | $input.persons | map(select(.personID == $id)))(jqplay) -
现在这就是你要问的,但更恶心:
[. as $input | [11111, 22222, 33333, 44444, 55555][] | . as $id | $input.persons | map(select(.personID == $id)) | map(.phoneNumber) | join("")] | join(";")(jqplay)。你应该认真避免使用它,等待比我更了解jq的人会清理这个烂摊子。 -
解决方案一定要用jq吗?
标签: json bash export-to-csv jq