J'ai un fichier vcf qui contient de nombreuses vcards.
Lors de l'importation du fichier vcf dans Outlook, il semble que seule la première vcard soit importée.
C'est pourquoi je veux les diviser.
Étant donné qu'une vcard commence par
BEGIN:VCARD
et se termine par
END:VCARD
Quelle est la meilleure façon de diviser chaque vcard en son propre fichier.
Merci
MISE À JOUR
Merci pour toutes les réponses. Comme pour les questions de cette nature, il existe différentes façons d'écorcher un chat. Voici le raisonnement pour lequel j'ai choisi celui que j'ai fait.
ARRONDISSEMENT
Voici un résumé de ce que j'ai aimé dans chaque réponse et ce qui m'a poussé à en sélectionner une.
csplit
: J'ai vraiment beaucoup aimé la concision de cette méthode. Je souhaitais juste qu'il puisse également définir l'extension de fichier.gawk
: Il a fait tout ce que je lui ai demandé.paralell
: Travaillé. Mais j'ai dû installer de nouvelles choses. (il a également décidé de créer un nouveau répertoire / bin dans mon répertoire personnel)perl
: J'ai aimé qu'il ait créé vcf basé sur le nom du contact. Mais l'option -o n'a pas vraiment fonctionné
Conclusion
- Donc, le premier à aller était
perl
parce qu'il était un peu cassé - Ensuite,
paralell
parce que je devais installer de nouvelles choses - Ensuite
csplit
, car pour autant que je puisse voir, il ne peut pas créer d'extensions sur les fichiers de sortie - Le prix revient donc à gawk, pour être un utilitaire facilement disponible et suffisamment polyvalent pour que je puisse hacher et changer un peu le nom du fichier. Des points bonus
cmp
aussi :)
-b
?Réponses:
Vous pouvez utiliser awk pour le travail:
Détails
La ligne awk fonctionne comme ceci:
a
c'est un compteur qui est incrémenté sur chaqueBEGIN:VCARD
ligne et en même temps le nom du fichier de sortie est construit en utilisant sprintf (stocké dansfn
). Pour chaque ligne, la ligne actuelle ($0
) est ajoutée au fichier actuel (nomméfn
).Le dernier
echo $?
signifie que l'opérationcmp
a réussi, c'est-à-dire que tous les fichiers uniques concaténés sont égaux à l'exemple vcf de l'exemple d'origine.Notez que la redirection de sortie dans awk fonctionne différemment que dans shell. Cela signifie qu'avec
> fn
awk vérifie d'abord si le fichier est déjà ouvert. S'il est déjà ouvert, awk s'y ajoute . Si ce n'est pas le cas, il s'ouvre et le tronque.En raison de cette logique de redirection, nous devons fermer explicitement les fichiers ouverts implicitement, car sinon l'appel atteindrait la limite de fichier ouvert dans les cas où le fichier d'entrée contient de nombreux enregistrements.
la source
la source
La version GNU de csplit peut définir l'extension - la réponse d'Ignacio est, je pense, la plus concise, elle a juste besoin de cette dernière modification pour obtenir l'extension - en utilisant le format 'printf':
Voici l'extrait pertinent de la
csplit
page de manuel gnu :la source
Vous pouvez utiliser ce script pour faire le travail. Cela s'appelle split-vcf-file .
Exemple d'utilisation
Pour exécuter le script:
la source
En utilisant GNU Parallel, vous pouvez faire:
Ou si vous pouvez réfuter http://oletange.blogspot.com/2013/10/useless-use-of-cat.html, vous pouvez l'utiliser à la place:
Voir plus d'exemples: http://www.gnu.org/software/parallel/man.html
Regardez les vidéos d'introduction: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1
Installation en 10 secondes:
la source