将 ICS 转换为 table (awk)

Convert ICS into table (awk)

我正在尝试使用 awk 将 ics 文件解析为 table。

我的 ics 文件看起来像这样(这里只发布一个事件):

BEGIN:VEVENT
DTSTART:20171004T173000Z
DTEND:20171004T183000Z
DTSTAMP:20180209T144026Z
UID:999999c@google.com
CREATED:20171004T171653Z
DESCRIPTION:
LAST-MODIFIED:20171004T173916Z
LOCATION:
SEQUENCE:0
STATUS:CONFIRMED
SUMMARY:This text is the summary
TRANSP:OPAQUE
X-APPLE-TRAVEL-ADVISORY-BEHAVIOR:AUTOMATIC
BEGIN:VALARM
ACTION:NONE
TRIGGER;VALUE=DATE-TIME:19760401T005545Z
X-WR-ALARMUID:282393849382
UID:883928394839283948392
ACKNOWLEDGED:20171004T173915Z
X-APPLE-DEFAULT-ALARM:TRUE
END:VALARM
END:VEVENT

我只对以 DTSTARTDTENDCREATEDSUMMARY

开头的行感兴趣

我想出了下面的代码

BEGIN{OFS="\t"}
=="DTSTART"{DTSTART=}
=="DTEND"{DTEND=}
=="CREATED"{CREATED=}
=="SUMMARY"{SUMMARY=}
{print DTSTART DTEND CREATED SUMMARY}

我正在执行

awk -F":" -f ics.awk file.ics

但是好像哪里出错了。 另外,最好打印一个 table header.

只需将最后一行替换为

/^END:VEVENT/ {print DTSTART, DTEND, CREATED, SUMMARY}

第一个是

BEGIN{
  OFS="\t"
  print "DTSTART", "DTEND", "CREATED", "SUMMARY"
}

结果:

DTSTART DTEND   CREATED SUMMARY
20171004T173000Z    20171004T183000Z    20171004T171653Z    This text is the summary

您正在为每一行执行“{print DTSTART DTEND CREATED SUMMARY}”。

简短awk解决方案(针对静态输入文件格式):

awk -F':' '~/^(DTSTART|DTEND|CREATED|SUMMARY)/{ 
               printf "%s%s",,(=="SUMMARY"? ORS:"\t") 
          }' file.ics

输出:

20171004T173000Z    20171004T183000Z    20171004T171653Z    This text is the summary