"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"
}
]
}
]
}
我有包含日历所有者事件(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"
}
]
}
]
}