"Unmerging" 将 google 日历数据与 jq 合并

"Unmerging" merged google calendar data with jq

我有包含日历所有者事件(UID 包含 google.com)和从 hebcal.com 导入的事件(UID 包含 hebcal)的 ical 数据。我想使用 jq 来制作两个独立且完整的 ical 文件。 ical2json 将 .ics 转换为 .json 。到目前为止,我已经设法用

隔离数据
cat basic.json | jq '.VCALENDAR[].VEVENT[] | select(.UID | contains("google.com"))'

如何重新创建仅包含 google.com 或 hebal.com 数据的原始结构?

这是包含两个事件的整个结构的示例 json,一个来自 google,一个来自 hebcal。因此,想象一下生成相同的结构,但只有 google 个事件。

{
  "VCALENDAR": [
    {
      "PRODID": "-//Google Inc//Google Calendar 70.9054//EN",
      "VERSION": "2.0",
      "CALSCALE": "GREGORIAN",
      "METHOD": "PUBLISH",
      "X-WR-CALNAME": "Events - TS Cinnaminson",
      "X-WR-TIMEZONE": "America/New_York",
      "VTIMEZONE": [
        {
          "TZID": "America/New_York",
          "X-LIC-LOCATION": "America/New_York",
          "DAYLIGHT": [
            {
              "TZOFFSETFROM": "-0500",
              "TZOFFSETTO": "-0400",
              "TZNAME": "EDT",
              "DTSTART": "19700308T020000",
              "RRULE": "FREQ=YEARLY;BYMONTH=3;BYDAY=2SU"
            }
          ],
          "STANDARD": [
            {
              "TZOFFSETFROM": "-0400",
              "TZOFFSETTO": "-0500",
              "TZNAME": "EST",
              "DTSTART": "19701101T020000",
              "RRULE": "FREQ=YEARLY;BYMONTH=11;BYDAY=1SU"
            }
          ]
        }
      ],
      "VEVENT": [
        {
          "DTSTART;VALUE=DATE": "20170930",
          "DTEND;VALUE=DATE": "20171001",
          "DTSTAMP": "20170626T155902Z",
          "UID": "hebcal-20170930-6d1036bc2e3a7c743225174c4feb5d1f",
          "URL": "http://hebcal.com/h/yom-kippur",
          "CLASS": "PUBLIC",
          "CREATED": "20170603T024831Z",
          "DESCRIPTION": "Day of Atonement\n\nhttp://hebcal.com/h/yom-kippur",
          "LAST-MODIFIED": "20170626T153742Z",
          "LOCATION": "",
          "SEQUENCE": "0",
          "STATUS": "CONFIRMED",
          "SUMMARY": "Yom Kippur",
          "TRANSP": "OPAQUE",
          "X-MICROSOFT-CDO-BUSYSTATUS": "OOF"
        },
        {
          "DTSTART": "20170731T233000Z",
          "DTEND": "20170801T003000Z",
          "DTSTAMP": "20170626T155902Z",
          "UID": "va6vhj4qba2rll8epdmccnjs@google.com",
          "CREATED": "20170523T010707Z",
          "DESCRIPTION": "",
          "LAST-MODIFIED": "20170523T010707Z",
          "LOCATION": "",
          "SEQUENCE": "0",
          "STATUS": "CONFIRMED",
          "SUMMARY": "Service",
          "TRANSP": "OPAQUE"
        }
      ]
    }
  ]
}

期望的输出是:

{
  "VCALENDAR": [
    {
      "PRODID": "-//Google Inc//Google Calendar 70.9054//EN",
      "VERSION": "2.0",
      "CALSCALE": "GREGORIAN",
      "METHOD": "PUBLISH",
      "X-WR-CALNAME": "Events - TS Cinnaminson",
      "X-WR-TIMEZONE": "America/New_York",
      "VTIMEZONE": [
        {
          "TZID": "America/New_York",
          "X-LIC-LOCATION": "America/New_York",
          "DAYLIGHT": [
            {
              "TZOFFSETFROM": "-0500",
              "TZOFFSETTO": "-0400",
              "TZNAME": "EDT",
              "DTSTART": "19700308T020000",
              "RRULE": "FREQ=YEARLY;BYMONTH=3;BYDAY=2SU"
            }
          ],
          "STANDARD": [
            {
              "TZOFFSETFROM": "-0400",
              "TZOFFSETTO": "-0500",
              "TZNAME": "EST",
              "DTSTART": "19701101T020000",
              "RRULE": "FREQ=YEARLY;BYMONTH=11;BYDAY=1SU"
            }
          ]
        }
      ],
      "VEVENT": [
        {
          "DTSTART": "20170731T233000Z",
          "DTEND": "20170801T003000Z",
          "DTSTAMP": "20170626T155902Z",
          "UID": "va6vhj4qba2rll8epdmccnjs@google.com",
          "CREATED": "20170523T010707Z",
          "DESCRIPTION": "",
          "LAST-MODIFIED": "20170523T010707Z",
          "LOCATION": "",
          "SEQUENCE": "0",
          "STATUS": "CONFIRMED",
          "SUMMARY": "Service",
          "TRANSP": "OPAQUE"
        }
      ]
    }
  ]   
}

使用更新赋值运算符|=:

jq '.VCALENDAR[0].VEVENT |= map(select(.UID | contains("google.com")))' base.json

输出:

{
  "VCALENDAR": [
    {
      "PRODID": "-//Google Inc//Google Calendar 70.9054//EN",
      "VERSION": "2.0",
      "CALSCALE": "GREGORIAN",
      "METHOD": "PUBLISH",
      "X-WR-CALNAME": "Events - TS Cinnaminson",
      "X-WR-TIMEZONE": "America/New_York",
      "VTIMEZONE": [
        {
          "TZID": "America/New_York",
          "X-LIC-LOCATION": "America/New_York",
          "DAYLIGHT": [
            {
              "TZOFFSETFROM": "-0500",
              "TZOFFSETTO": "-0400",
              "TZNAME": "EDT",
              "DTSTART": "19700308T020000",
              "RRULE": "FREQ=YEARLY;BYMONTH=3;BYDAY=2SU"
            }
          ],
          "STANDARD": [
            {
              "TZOFFSETFROM": "-0400",
              "TZOFFSETTO": "-0500",
              "TZNAME": "EST",
              "DTSTART": "19701101T020000",
              "RRULE": "FREQ=YEARLY;BYMONTH=11;BYDAY=1SU"
            }
          ]
        }
      ],
      "VEVENT": [
        {
          "DTSTART": "20170731T233000Z",
          "DTEND": "20170801T003000Z",
          "DTSTAMP": "20170626T155902Z",
          "UID": "va6vhj4qba2rll8epdmccnjs@google.com",
          "CREATED": "20170523T010707Z",
          "DESCRIPTION": "",
          "LAST-MODIFIED": "20170523T010707Z",
          "LOCATION": "",
          "SEQUENCE": "0",
          "STATUS": "CONFIRMED",
          "SUMMARY": "Service",
          "TRANSP": "OPAQUE"
        }
      ]
    }
  ]
}