Arrays 如何使用jq从JSON数组中提取特定字段

Arrays 如何使用jq从JSON数组中提取特定字段,arrays,select,jq,Arrays,Select,Jq,我想使用jq处理JSON数据。以下是数据摘录: { "lat": "49.3877286", "lon": "6.704062", "tag": [ { "k": "name", "v": "Beckingen" }, { "k": "is_in", "v": "Merzig-Wadern,Saarland,Bundesrepublik Deutschland,Europe" }, {

我想使用jq处理JSON数据。以下是数据摘录:

{
  "lat": "49.3877286",
  "lon": "6.704062",
  "tag": [
    {
      "k": "name",
      "v": "Beckingen"
    },
    {
      "k": "is_in",
      "v": "Merzig-Wadern,Saarland,Bundesrepublik Deutschland,Europe"
    },
    {
      "k": "place",
      "v": "town"
    },
  ]
}
{
  "lat": "49.287307",
  "lon": "6.8827786",
  "tag": [
    {
      "k": "name",
      "v": "Püttlingen"
    },
    {
      "k": "place",
      "v": "town"
    },
    {
      "k": "population",
      "v": "18748"
    }
  ]
}
我需要提取
lat
lon
name
字段,如下所示:

{
  "lat": "49.3877286",
  "lon": "6.704062",
  "name": "Beckingen"
},
{
  "lat": "49.287307",
  "lon": "6.8827786",
  "name": "Püttlingen"
}
我就快到了,但我不知道如何使用
select()
从数组中选择字段。谁能给我指出正确的方向吗

非常感谢,


Enno

根据您的具体要求,您可以使用
映射(选择(…)
[]|选择(…)
,例如:

.tag[] | select(.k == "name") | .v
您可能希望使其更加健壮,例如,考虑到可能没有一个“名称”:


根据您的具体要求,您可以使用
map(选择(…)
[]|选择(…)
,例如:

.tag[] | select(.k == "name") | .v
您可能希望使其更加健壮,例如,考虑到可能没有一个“名称”:

好的,我明白了:

{lat: .lat, lon: .lon, tag: .tag[]}
| select(.tag.k=="name") 
| {lat: .lat, lon: .lon, name: .tag.v}
诀窍是使用
.tag[]
将每个条目乘以
.tag
中的数组元素数,然后选择相关条目,然后构造输出JSON。谢谢你的提示,@peak

好的,我明白了:

{lat: .lat, lon: .lon, tag: .tag[]}
| select(.tag.k=="name") 
| {lat: .lat, lon: .lon, name: .tag.v}

诀窍是使用
.tag[]
将每个条目乘以
.tag
中的数组元素数,然后选择相关条目,然后构造输出JSON。谢谢你的提示,@peak

您可以将其简化为{lat,long,name:(.tag[]| select(.k==“name”)|.v)}很酷,谢谢!为了完成:在这个特殊的例子中,它是
lon
,而不是
long
。您可以将它简化为{lat,long,name:(.tag[]| select(.k==“name”)|.v)}很酷,谢谢!为了完成:在这种特殊情况下,它是
lon
,而不是
long