如何使用jq在JSON数组中复制现有对象?

4
我有以下的geojson文件:
{
    "type": "FeatureCollection",
    "features": [{
            "type": "Feature",
            "properties": {
                "LINE": "RED",
                "STATION": "Harvard"
            },
            "geometry": {
                "type": "Point",
                "coordinates": [-71.118906072378209, 42.37402923068516]
            }
        },
        {
            "type": "Feature",
            "properties": {
                "LINE": "RED",
                "STATION": "Ashmont"
            },
            "geometry": {
                "type": "Point",
                "coordinates": [-71.063430144389983, 42.283883546225319]
            }
        }
    ]
}

我想将 "features" 数组中的第二个对象追加到末尾,从而创建3个对象。使用以下片段会出现错误 "array ([{"type":"F...) 和 object ({"type":"Fe...) 无法添加"。是否有一种方法可以在不硬编码键-值对的情况下使用 jq 完成这个操作?参考 这里
cat red_line_nodes.json | jq '.features |= . + .[length-1]' > red_line_nodes_2.json

你想要向数组中添加什么呢? - jordanm
我想复制一个现有对象并将其添加到数组中。我之前在SO上找到的答案只展示了如何通过键入各种键和值来添加新对象;我想知道的是是否可以使用对现有文件的引用来添加新对象。 - m.brocks
@m.brocks:根据您上面的评论,我已经删除了重复的标签。 - Inian
2个回答

4

jq 解决方案:

jq '.features |= . + [.[-1]]' red_line_nodes.json

输出结果:
{
  "type": "FeatureCollection",
  "features": [
    {
      "type": "Feature",
      "properties": {
        "LINE": "RED",
        "STATION": "Harvard"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          -71.11890607237821,
          42.37402923068516
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "LINE": "RED",
        "STATION": "Ashmont"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          -71.06343014438998,
          42.28388354622532
        ]
      }
    },
    {
      "type": "Feature",
      "properties": {
        "LINE": "RED",
        "STATION": "Ashmont"
      },
      "geometry": {
        "type": "Point",
        "coordinates": [
          -71.06343014438998,
          42.28388354622532
        ]
      }
    }
  ]
}

谢谢 - 这正是我想要弄清楚的! - m.brocks

1
作为参考,使用|= . + ...的替代方法是使用+=。然而,在您的情况下,您需要编写:

.features += [.features[-1]]

所以它并没有更短。


但是为什么它能工作呢?在 |= 中,操作符左侧的“上下文”是数组,因此您必须在操作符右侧仅使用 . 来引用该数组。而在这里,您必须在 += 操作符的两侧都使用 .features。这是什么解释呢? - Martin Mucha
@MartinMucha - (FOO += BAR) 的语义相当于 . as $in | (FOO += ($in|BAR)) - peak
谢谢!虽然我并不完全理解它(这让我笑了,我本以为随着学习 jq 的深入,自己会变得越来越不惊讶的,但事实并非如此)。让我尝试解释一下。1. 我将当前上下文保存到变量中。2. 因为 |+|= .+,所以我将通过过滤器 BAR 过滤的当前上下文添加到可从当前上下文访问的 FOO 中。啊,是的,太好了,这正好解释了它们之间的区别。好的,我现在明白了。再次感谢。(将这段文字保留在这里,可以帮助我在写作时理解它,同样也适用于阅读时理解它。) - Martin Mucha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接