jq过滤嵌套数组数组中值不同的项
jq filter items where values in a nested array array are different
假设我有以下 json。我想获取“员工”在一年中拥有不同团队的所有项目。
[
{
"id": 122343,
"name": "Tom Muller",
"teams": [
{
"year": "2010-2011",
"team_id": 27
},
{
"year": "2011-2012",
"team_id": 27
},
{
"year": "2013-2014",
"team_id": 27
}
]
},
{
"id": 338744,
"name": "Eric Gonzales",
"teams": [
{
"year": "2010-2011",
"team_id": 12
},
{
"year": "2011-2012",
"team_id": 17
},
{
"year": "2013-2014",
"team_id": 17
}
]
}
]
我想用 jq 查询数组,输出会 return
{
"id": 338744,
"name": "Eric Gonzales",
"teams": [
{
"year": "2010-2011",
"team_id": 12
},
{
"year": "2011-2012",
"team_id": 17
},
{
"year": "2013-2014",
"team_id": 17
}
]
}
我将如何编写这样的查询?
谢谢
使用 unique_by
可以将 .teams
数组缩减为 .team_id
不同的数组,使用 select
和 length
可以过滤那些拥有不止一件这样的物品的人。
jq '.[] | select(.teams | unique_by(.team_id) | length > 1)'
{
"id": 338744,
"name": "Eric Gonzales",
"teams": [
{
"year": "2010-2011",
"team_id": 12
},
{
"year": "2011-2012",
"team_id": 17
},
{
"year": "2013-2014",
"team_id": 17
}
]
}
这会为您提供一系列对象(以防有多个结果)。如果您想将它们作为数组,请使用 map(select(…))
而不是 .[] | select(…)
。
假设我有以下 json。我想获取“员工”在一年中拥有不同团队的所有项目。
[
{
"id": 122343,
"name": "Tom Muller",
"teams": [
{
"year": "2010-2011",
"team_id": 27
},
{
"year": "2011-2012",
"team_id": 27
},
{
"year": "2013-2014",
"team_id": 27
}
]
},
{
"id": 338744,
"name": "Eric Gonzales",
"teams": [
{
"year": "2010-2011",
"team_id": 12
},
{
"year": "2011-2012",
"team_id": 17
},
{
"year": "2013-2014",
"team_id": 17
}
]
}
]
我想用 jq 查询数组,输出会 return
{
"id": 338744,
"name": "Eric Gonzales",
"teams": [
{
"year": "2010-2011",
"team_id": 12
},
{
"year": "2011-2012",
"team_id": 17
},
{
"year": "2013-2014",
"team_id": 17
}
]
}
我将如何编写这样的查询?
谢谢
使用 unique_by
可以将 .teams
数组缩减为 .team_id
不同的数组,使用 select
和 length
可以过滤那些拥有不止一件这样的物品的人。
jq '.[] | select(.teams | unique_by(.team_id) | length > 1)'
{
"id": 338744,
"name": "Eric Gonzales",
"teams": [
{
"year": "2010-2011",
"team_id": 12
},
{
"year": "2011-2012",
"team_id": 17
},
{
"year": "2013-2014",
"team_id": 17
}
]
}
这会为您提供一系列对象(以防有多个结果)。如果您想将它们作为数组,请使用 map(select(…))
而不是 .[] | select(…)
。