“unmerging”合并谷歌日历数据与jq
问题描述:
我有ical数据包含日历所有者的事件(UID包含google.com)和从hebcal.com(UID包含hebcal)导入的事件。我想用jq来制作两个独立完整的ical文件。 ical2json将.ics转换为.json。到目前为止,我已设法隔离数据“unmerging”合并谷歌日历数据与jq
cat basic.json | jq '.VCALENDAR[].VEVENT[] | select(.UID | contains("google.com"))'
如何重新创建包含google.com或hebal.com数据的原始结构?
下面是整个结构的示例json,其中两个事件来自谷歌,一个来自hebcal。所以想象生产相同的结构,但只是谷歌事件。
{
"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": "[email protected]",
"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": "[email protected]",
"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": "[email protected]",
"CREATED": "20170523T010707Z",
"DESCRIPTION": "",
"LAST-MODIFIED": "20170523T010707Z",
"LOCATION": "",
"SEQUENCE": "0",
"STATUS": "CONFIRMED",
"SUMMARY": "Service",
"TRANSP": "OPAQUE"
}
]
}
]
}
+0
感谢RomanPerekhrest。正是我需要的。 –
向我们展示你的输入JSON有问题和您正在寻找的_exact_最终输出 – Inian