# Rendre un .vcf "easy to read" via script Bash

**URL:** <https://www.debian-fr.org/t/rendre-un-vcf-easy-to-read-via-script-bash/57227>\
**Category:** Programmation\
**Created:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/rendre-un-vcf-easy-to-read-via-script-bash/57227 "2016-02-21T14:39:04Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![koshie](https://www.debian-fr.org/user_avatar/www.debian-fr.org/koshie/32/5427_2.png) [@koshie](https://www.debian-fr.org/u/koshie)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/rendre-un-vcf-easy-to-read-via-script-bash/57227/1 "2016-02-21T14:39:04Z")

</div>

Bonjour,

Petit exercice personnel: J’ai un .vcf qui contient tout mes anciens contacts (nom, téléphone et e-mail pour certains). Ce que j’aimerai c’est pouvoir importer les informations importantes instantanemment via un script dans une forme plus sympatique que la tronche du .vcf:

> [@](#):
>
> BEGIN:VCARD  
> VERSION:3.0  
> N:;truc;;;  
> FN:truc  
> TEL;TYPE=CELL:0606060606  
> EMAIL;TYPE=PREF:truc\_machin@example.com  
> END:VCARD

La forme que je désire pourrait être:

> [@](#):
>
> Contact: truc  
> Téléphone: 0606060606  
> E-mail: [truc\_machin@example.com](mailto:truc_machin@example.com)

Je pense que j’ai plusieurs outils dont j’ai besoin: grep (trouver les occurences), awk, cut (enlever les «&nbsp;FN&nbsp;», «&nbsp;N&nbsp;», «&nbsp;TEL&nbsp;» et «&nbsp;EMAIL&nbsp;») etc.

Ce qui m’intéresse ce n’est pas que vous me donniez du code (pas de suite du moins) mais des pistes sur la manière dont le problème doit être traité.

Pour moi ça se passerai comme ça:

Le script commence par chercher l’occurrence «&nbsp;BEGIN&nbsp;» (qui marque le début d’un contact) et vérifie que les occurrences suivantes sont présentes: FN, TEL, EMAIL.  
Pour chaque occurrence présente il va prendre la ligne et découper (cut?) la partie intéressante (après «&nbsp;:&nbsp;») et continue jusqu’à ce qu’il tombe sur «&nbsp;END&nbsp;», une fois tombé dessus j’envoie par exemple un petit echo avec une ligne vide et un retour à la ligne pour faire une démarcation entre deux contacts.

Qu’en pensez-vous? Vous avez plus simple?

Pour le moment je pourrai facilement afficher via grep les lignes qui m’intéressent:

```auto
grep occurence ~/monfichier.vcf
```

Seulement mon problème c’est de faire en sorte que chaque occurence aille au bon endroit (le bon contact), et c’est avec le marquage avec BEGIN et END qui doit m’aider je suppose. Mais je ne vois pas comment faire.

Une idée?

Koshicalement, koshie

---

<div class="post-metadata">

**Author:** ![koshie](https://www.debian-fr.org/user_avatar/www.debian-fr.org/koshie/32/5427_2.png) [@koshie](https://www.debian-fr.org/u/koshie)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/rendre-un-vcf-easy-to-read-via-script-bash/57227/2 "2016-02-21T14:39:04Z")

</div>

Dans [ce topic](https://www.debian-fr.org/awk-afficher-les-x-lignes-suivantes-t41846.html) j’ai pu apercevoir une ligne intéressante que j’ai adapté:

```auto
awk '/FN:/ { print }' ~/00001.vcf
```

ce qui donne:

> [@](#):
>
> FN:machin  
> FN:machin bidule  
> FN:machin chouette  
> FN:truc bidule  
> …

Et dans le contexte la personne voulait afficher «&nbsp;X&nbsp;» lignes après le début de l’occurrence, moi je voudrais qu’il affiche TOUTES les occurrences mais en les regroupant par celle qui sont dans la même vcard (entre BEGIN et END).

---

<div class="post-metadata">

**Author:** ![koshie](https://www.debian-fr.org/user_avatar/www.debian-fr.org/koshie/32/5427_2.png) [@koshie](https://www.debian-fr.org/u/koshie)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/rendre-un-vcf-easy-to-read-via-script-bash/57227/3 "2016-02-21T14:39:05Z")

</div>

Je me suis rendu compte que grep est peut-être «&nbsp;trop faible&nbsp;» pour ce que je lui demande, par contre egrep lui:

```auto
egrep 'FN:|TEL;TYPE=CELL|EMAIL' ~/00001.vcf
```

Me donne un retour intéressant:

> [@](#):
>
> FN:machin truc  
> TEL;TYPE=CELL:0606060606  
> EMAIL:machin.truc@example.com

Toutes les lignes avec le mot spécifié sont affichés et dans le bon ordre. Maintenant pour obtenir un résultat correct il faut:

\_ Que je remplace les occurrences par (respectivement): Contact, Téléphone et E-mail.  
\_ Qu’il y est une ligne de séparation entre chaque vcard, le soucis étant que si je désire faire un saut à la ligne après chaque «&nbsp;E-mail&nbsp;» (dont les occurrences sont très faibles) je n’aurai pas tout mes contacts avec cette séparation. Si je le fais après «&nbsp;Téléphone&nbsp;» je vais sauter une petite partie de mes contacts (et c’est moche).  
Idem, si je fais un saut à la ligne avant Contact j’aurai en début de fichier une ligne vide, que je pourrai corriger en une autre commande mais c’est se prendre la tête pour faire un truc pas très élégant au final, je pense. Autant se prendre la tête à faire un truc bien, non?

Avez-vous une idée? Je continue mes recherches.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/rendre-un-vcf-easy-to-read-via-script-bash/57227/4 "2016-02-21T14:39:24Z")

</div>

À vu de nez tu peut tout faire avec awk assez facilement. C’est un langage de script à part entière. Tu peut l’utiliser ainsi :

`#!/usr/bin/awk -f
/plouf/ {
    print "bidule"
}
`

Voici un exemple simpliste :

[code]#!/usr/bin/awk -f

BEGIN {  
FS=";|:“  
OFS=” : "  
}

$1 == “FN” {  
print “nom”, $NF  
}

$1 == “EMAIL” {  
print “e-mail”, $NF  
}

$1 == “TEL” {  
print “téléphone”, $NF  
}[/code]  
Je ne connais pas la signification de chaque champ. Tu peut dans chaque close y mettre la logique que tu souhaite pour sortir le code postale et l’adresse etc.

---

<div class="post-metadata">

**Author:** ![koshie](https://www.debian-fr.org/user_avatar/www.debian-fr.org/koshie/32/5427_2.png) [@koshie](https://www.debian-fr.org/u/koshie)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/rendre-un-vcf-easy-to-read-via-script-bash/57227/5 "2016-02-21T14:39:32Z")

</div>

Merci pour ton code !

J’ai crée un fichier .awk avec le contenu que tu m’as donné, je l’exécute mais j’ai une erreur:

[quote]koshie@OnyxU:~$ bash scripts/awk/easy-to-read-vcf.awk 00001.vcf  
scripts/awk/easy-to-read-vcf.awk: ligne 3: BEGIN : commande introuvable  
scripts/awk/easy-to-read-vcf.awk: ligne 6: Erreur de syntaxe près du symbole inattendu « } »  
scripts/awk/easy-to-read-vcf.awk: ligne 6: `}’[/quote]

(J’ai cru comprendre qu’il se lancait via bash/sh et non pas avec la commande awk qui me renvoit l’erreur:

[quote]awk: ligne de commande :1: scripts/awk/easy-to-read-vcf.awk  
awk: ligne de commande :1: ^ syntax error  
[/quote]

Une idée?

---

<div class="post-metadata">

**Author:** ![koshie](https://www.debian-fr.org/user_avatar/www.debian-fr.org/koshie/32/5427_2.png) [@koshie](https://www.debian-fr.org/u/koshie)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/rendre-un-vcf-easy-to-read-via-script-bash/57227/6 "2016-02-21T14:39:32Z")

</div>

J’ai trouvé la solution, en fait il fallait taper:

> [@](#):
>
> awk -f scripts/awk/easy-to-read-vcf.awk 00001.vcf \> 00001.vcf.txt

Je n’ai pas de saut à la ligne par contre.

---

<div class="post-metadata">

**Author:** ![MisterFreez](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/m/bb73d2/32.png) [@MisterFreez](https://www.debian-fr.org/u/MisterFreez)\
**Post date:** [Février 21, 2016, 2:39 UTC](https://www.debian-fr.org/t/rendre-un-vcf-easy-to-read-via-script-bash/57227/7 "2016-02-21T14:39:33Z")

</div>

Plus simple, tu le rend exécutable et tu le lance comme ça :

```auto

```

---

<div class="post-metadata">

**Author:** ![grandtoubab](https://www.debian-fr.org/user_avatar/www.debian-fr.org/grandtoubab/32/4505_2.png) [@grandtoubab](https://www.debian-fr.org/u/grandtoubab)\
**Post date:** [Juin 20, 2016, 2:20 UTC](https://www.debian-fr.org/t/rendre-un-vcf-easy-to-read-via-script-bash/57227/8 "2016-06-20T14:20:08Z")

</div>

Salut  
Confronté au même besoin ça marche bien.

```
debian:~/Documents$ cat read-vc.awk
#!/usr/bin/awk -f
BEGIN {
   FS=";|:"
   OFS=" : "
}
$1 == "FN" {
   print "nom", $NF
}
$1 == "EMAIL" {
   print "e-mail", $NF
}
$1 == "TEL" {
   print "téléphone", $NF
}

@debian:~/Documents$ sudo chmod 755 read-vc.awk

```

Et hop

`@debian:~/Documents$ ./read-vc.awk 00001.vcf > 00001.txt`

Puis j’ai ouvert le fichier 00001.txt avec libreoffice calc en disant que le séparateur est le : dans autre et en décochant tous les autres

Merci les gars 😀
