在bash中解析ics文件以消除重复

在bash中解析ics文件以消除重复,bash,icalendar,Bash,Icalendar,我的SOGo日历崩溃了,我最终得到了来自不同设备的5个不同ics文件,这些文件一度与服务器同步。每个文件中的事件基本相同,但每个文件中都有一些独特的事件。”我试图制作一个包含bash中所有唯一事件的ics文件。 到目前为止,我已经能够通过以下代码消除具有相同UID的重复项: #!/bin/bash declare -a puids while read -r p; do if [[ "$p" != *BEGIN:VEVENT* ]]; then echo $p

我的SOGo日历崩溃了,我最终得到了来自不同设备的5个不同ics文件,这些文件一度与服务器同步。每个文件中的事件基本相同,但每个文件中都有一些独特的事件。”我试图制作一个包含bash中所有唯一事件的ics文件。 到目前为止,我已经能够通过以下代码消除具有相同UID的重复项:

#!/bin/bash
declare -a puids
while read -r p; do
    if [[ "$p" != *BEGIN:VEVENT* ]]; then
        echo $p
        #all lines on top of file are printed until the first event
    else
        #the else clause is executed at the start of an event
        read -r q
        #that's the next line which should be the uid
        if [[ -v puids["$q"] ]]; then
            # this uid has already been printed
            while [[ "$q" != *END:VEVENT* ]]; do
                read -r q
            done
        else
            echo $p
            while [[ "$q" != *END:VENVENT* ]]; do
                echo $q
                read -r q
            done
            echo $q
            #q should equal the end:vevent line
        fi
    fi
    while read -r p; do
        echo $p
    done
done < "$1"

正如你所看到的,不同的手机在同一时区使用不同的术语,但是开始和结束时间是相同的。UID是不同的,因此我的脚本认为它们是独立的事件。

如果您可以发布要消除的示例事件,这将有所帮助:相同的事件,但UID不同。如果没有一些输入,很难针对您遇到的特定问题提供任何反馈。您的代码是非常重复的。也许可以对它进行重构,只在一个地方读取内容,然后根据几个状态变量决定如何处理这些内容。那么,“这是一个UID”只是需要处理的另一个状态。如果你这么做了,也许还可以考虑从Bash转移到Awk。更基本的是,我想把title、start time和end time组合成一个新的键,然后用它来代替UID来识别事件?如果编辑了某些内容,但一台设备没有捕获并同步该特定事件,则仍然会失败。谢谢,我不太确定如何将变量组合成一个键。另外,在上面关于时区的例子中,它是同一个时区,只是表达方式不同。我认为我真正需要的是结构的c等价物,但事件中元素的数量是可变的
BEGIN:VEVENT
CREATED:20200111T032850Z
LAST-MODIFIED:20200111T032850Z
DTSTAMP:20200111T023515Z
UID:15787101159003d6047c6800240939a4e21326acef35e@sufficientlysecure.org
SUMMARY:Sarasota
ORGANIZER:mailto:joedebby@dbr.jr
DTSTART;TZID=/freeassociation.sourceforge.net/America/Cayman:20191230T0830
00
DTEND:20191230T213000Z
BEGIN:VALARM
ACTION:DISPLAY
TRIGGER;VALUE=DURATION:-PT60M
DESCRIPTION:Sarasota
X-EVOLUTION-ALARM-UID:b58c68f0b0cccdcce0692f54d5e066332559493d
END:VALARM
END:VEVENT
BEGIN:VEVENT
CREATED:20200111T032943Z
LAST-MODIFIED:20200111T032943Z
DTSTAMP:20200111T022536Z
UID:1578709537738a2d30f66b6a1498cadbd3d4ff1f01d13@sufficientlysecure.org
SUMMARY:Sarasota
ORGANIZER:mailto:joedebby@dbr.jr
DTSTART;TZID=/freeassociation.sourceforge.net/America/New_York:20191230T08
3000
DTEND:20191230T213000Z
BEGIN:VALARM
ACTION:DISPLAY
TRIGGER;VALUE=DURATION:-PT60M
DESCRIPTION:Sarasota
X-EVOLUTION-ALARM-UID:cfbc357d80d9e53ad0b0e60d63905add8ddf2cc1
END:VALARM
END:VEVENT