“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" 
     } 
     ] 
    } 
    ] 
} 
+2

向我们展示你的输入JSON有问题和您正在寻找的_exact_最终输出 – Inian

使用更新赋值操作符|=

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。正是我需要的。 –