У меня есть файл VCF, который содержит множество VCARD.
При импорте vcf-файла в outlook кажется, что он импортирует только первую vcard.
Поэтому я хочу разделить их.
Учитывая, что vcard начинается с
BEGIN:VCARD
и заканчивается
END:VCARD
Каков наилучший способ разбить каждую vcard на отдельный файл?
Благодарность
ОБНОВИТЬ
Спасибо за все ответы. Как и в случае с вопросами такого рода, существуют различные способы снятия кожи с кошки. Вот причина, почему я выбрал тот, который я сделал.
ОКРУГЛЯТЬ
Вот обзор того, что мне понравилось в каждом ответе и что заставило меня выбрать один из них.
csplit
Мне очень понравилась лаконичность этого метода. Я просто хотел, чтобы он мог также установить расширение файла.gawk
: Он сделал все, что я просил об этом.paralell
: Работал. Но я должен был установить новые вещи. (также решил сделать новый / bin dir в моем домашнем каталоге)perl
Мне понравилось, что он создал VCF на основе имени контакта. Но опция -o не сработала
Вывод
- Так что первым делом было,
perl
потому что он был немного сломан - Дальше было
paralell
потому что пришлось устанавливать новые вещи - Далее было
csplit
, потому что, насколько я вижу, он не может создавать расширения для выходных файлов - Таким образом, награда вручается gawk за то, что она легкодоступна и достаточно универсальна, так что я могу немного порезать и изменить имя файла. Бонусные баллы
cmp
тоже :)
-b
?Ответы:
Вы можете использовать awk для работы:
Детали
Строка awk работает следующим образом:
a
это счетчик, который увеличивается в каждойBEGIN:VCARD
строке, и в то же время выходное имя файла создается с использованием sprintf (хранится вfn
). Для каждой строки текущая строка ($0
) добавляется к текущему файлу (именованномуfn
).Последнее
echo $?
означает, что онcmp
был успешным, то есть все отдельные конкатенированные файлы совпадают с исходным примером vcf.Обратите внимание, что перенаправление вывода в awk работает иначе, чем в shell. Это означает, что с помощью
> fn
awk сначала проверяется, открыт ли файл. Если он уже открыт, то к нему добавляется awk . Если это не так, он открывает и усекает его.Из-за этой логики перенаправления мы должны явно закрывать неявно открытые файлы, так как в противном случае вызов достигнет предела открытого файла в случаях, когда входной файл содержит много записей.
источник
источник
Версия csplit для Gnu может установить расширение - ответ Игнасио, я думаю, является наиболее лаконичным, для получения расширения требуется лишь последняя настройка - используя формат «printf»:
Вот соответствующий фрагмент со
csplit
страницы руководства gnu :источник
Вы можете использовать этот скрипт, чтобы сделать работу. Это называется split-vcf-file .
Пример использования
Чтобы запустить скрипт:
источник
Используя GNU Parallel вы можете сделать:
Или, если вы можете опровергнуть http://oletange.blogspot.com/2013/10/useless-use-of-cat.html, вы можете использовать это вместо:
Смотрите больше примеров: http://www.gnu.org/software/parallel/man.html
Посмотрите вступительные видеоролики: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
10 секунд установки:
источник