Удалить дубликаты записей в файле vCard - PullRequest
0 голосов
/ 09 июня 2018

У меня есть файл vCard с записями для тысяч контактов.Этот файл был поврежден, и для каждого из пользователей были добавлены копии личного телефона, работы и дополнительных записей.

Как можно очистить дубликаты?

BEGIN:VCARD
VERSION:3.0
N:Doe;John;Q.,Public
FN;CHARSET=UTF-8:John Doe
TEL;TYPE=WORK,VOICE:(111) 555-1212
TEL;TYPE=WORK,VOICE:(111) 555-1212
TEL;TYPE=WORK,VOICE:(111) 555-1212
TEL;TYPE=WORK,VOICE:(111) 555-1212
TEL;TYPE=HOME,VOICE:(404) 555-1212
TEL;TYPE=HOME,VOICE:(404) 555-1212
TEL;TYPE=HOME,VOICE:(404) 555-1212
TEL;TYPE=HOME,TYPE=VOICE:(404) 555-1213
TEL;TYPE=HOME,TYPE=VOICE:(404) 555-1213
TEL;TYPE=HOME,VOICE:(404) 555-1212
TEL;TYPE=HOME,VOICE:(404) 555-1212
TEL;TYPE=HOME,VOICE:(404) 555-1212
TEL;TYPE=HOME,TYPE=VOICE:(404) 555-1213
TEL;TYPE=HOME,TYPE=VOICE:(404) 555-1213
TEL;TYPE=HOME,TYPE=VOICE:(404) 555-1213
TEL;TYPE=HOME,TYPE=VOICE:(404) 555-1213
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=INTERNET:example@example.com
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=INTERNET:example@example.com
EMAIL;TYPE=INTERNET:example@example.com
EMAIL;TYPE=INTERNET:example@example.com
EMAIL;TYPE=INTERNET:example@example.com
EMAIL;TYPE=INTERNET:example@example.com
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
ADR;TYPE=HOME:;;42 Plantation St.;Baytown;LA;30314;United States of America
URL:https://www.google.com/
PHOTO;VALUE=URL;TYPE=PNG:http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Example_svg.svg/200px-Example_svg.svg.png
AGENT:BEGIN:VCARD
 VERSION:3.0
 N:Doe;John;Q.,Public
 FN:John Doe
 TEL;TYPE=WORK,VOICE:(111) 555-1212
 TEL;TYPE=HOME,VOICE:(404) 555-1212
 TEL;TYPE=HOME,TYPE=VOICE:(404) 555-1213
 EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
 EMAIL;TYPE=INTERNET:example@example.com
 PHOTO;VALUE=URL;TYPE=PNG:http://upload.wikimedia.org/wikipedia/commons/thumb/a/a5/Example_svg.svg/200px-Example_svg.svg.png
 END:VCARD
END:VCARD

Я использовалСледующее решение встречалось в StackOverflow, но оно не решило проблему, поскольку не все дубликаты появляются последовательно.

perl -ne 'print unless (defined($prev) && ($_ eq $prev)); $prev=$_'

, что приводит к:

...
TEL;TYPE=WORK,VOICE:(111) 555-1212
TEL;TYPE=HOME,TYPE=VOICE:(404) 555-1213
TEL;TYPE=WORK,VOICE:(111) 555-1212
TEL;TYPE=HOME,TYPE=VOICE:(404) 555-1213
TEL;TYPE=WORK,VOICE:(111) 555-1212
TEL;TYPE=HOME,TYPE=VOICE:(404) 555-1213
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=INTERNET:example@example.com
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=INTERNET:example@example.com
EMAIL;TYPE=PREF,INTERNET:forrestgump@example.com
EMAIL;TYPE=INTERNET:example@example.com

1 Ответ

0 голосов
/ 09 июня 2018

Самый простой способ удалить все повторяющиеся строки - это

perl -ne 'print if !$seen{$_}++'

Если вы хотите обработать каждый BEGIN:VCARD раздел отдельно,

perl -ne '%seen = () if /\bBEGIN:VCARD\b/; print if !$seen{$_}++'
...