Xavier Nayrac

Rubyiste accro au TDD, serial blogger, apprenti data scientist, heureux utilisateur de Vim, accordéoniste.
Si vous vous sentez particulièrement généreux, suivez moi sur Twitter.

Utiliser Vim comme un tableur sur Linux (enfin presque)

| Comments

Niveau : avancé

Hier j’ai donné une liste des rapports issues/nombre de dépots par langages sur Github. Aujourd’hui je montre comment j’ai utilisé Vim (sur linux) pour calculer ce rapport et formater la liste.

Voici la liste de départ, à récupérer ici, il s’agit juste d’un copier/coller de la page web et je n’ai pris ici que les 5 premiers, c’est suffisant pour la démonstration:

1 	JavaScript .js	560,116	891,531	319,537	4,951	1,147	343,483
2 	Ruby .rb	466,411	469,913	175,577	2,726	607	147,339
3 	Java .java	388,610	376,683	231,186	4,185	825	161,136
4 	Python .py	281,835	323,858	130,034	2,538	685	184,908
5 	PHP .php	275,411	289,899	155,941	2,331	454	150,024

Alors on n’y comprend rien puisque les colonnes sont invisibles. On va former de belles colonnes à l’aide de l’utilitaire unix column:

1
:%! column -t

Et voici le résultat:

1  JavaScript  .js    560,116  891,531  319,537  4,951  1,147  343,483
2  Ruby        .rb    466,411  469,913  175,577  2,726  607    147,339
3  Java        .java  388,610  376,683  231,186  4,185  825    161,136
4  Python      .py    281,835  323,858  130,034  2,538  685    184,908
5  PHP         .php   275,411  289,899  155,941  2,331  454    150,024

Les colonnes qui m’intéresse sont la 1 (rang), la 2 (langage), la 4 (nombre de dépots) et la dernière (nombre d’issues actives). Je vais donc sélectionner la 3ème colonne à l’aide de Ctrl-v et la supprimer (avec d). Voici ce que donne la sélection d’une colonne en image si vous n’êtes pas familier de Vim:

Je répète ensuite la sélection/suppression pour les autres colonnes et j’obtiens:

1  JavaScript  560,116  343,483
2  Ruby        466,411  147,339
3  Java        388,610  161,136
4  Python      281,835  184,908
5  PHP         275,411  150,024

Il faut maintenant ajouter une colonne de chiffre qui contiendras le rapport d’issues par dépots en pourcentage. C’est à dire la 4ème colonne divisée par la 3ème colonne, le tout multiplié par 100. C’est classiquement un boulot qu’on confierai au langage Awk, mais j’ai décidé il y a quelques temps de faire le plus possible de choses avec Ruby, voici donc ce que j’ai écrit dans Vim:

1
:%! ruby -aple '$_ += " \#{(($F[3].to_f/$F[2].to_f)*100).to_i}"'

Un peu cryptique ? Je l’avoue bien volontiers, mais les one-shots sont rarement fait pour (peuvent rarement) être lisible… Je ferais certainement un article sur les switchs a, p, l et e de ruby. Quoiqu’il en soit, voici le résultat:

1  JavaScript  560,116  343,483 61
2  Ruby        466,411  147,339 31
3  Java        388,610  161,136 41
4  Python      281,835  184,908 65
5  PHP         275,411  150,024 54

Il reste à trier cette liste sur la 5ème et dernière colonne, un jeu d’enfant avec l’utilitaire unix sort:

1
:%! sort -k5nr
4  Python      281,835  184,908 65
1  JavaScript  560,116  343,483 61
5  PHP         275,411  150,024 54
3  Java        388,610  161,136 41
2  Ruby        466,411  147,339 31

Voilà, ça prend un certain temps à décrire mais c’est rapide à faire quand vous avez sous le coude une paire d’utilitaires qui déchirent !

À demain.

Articles connexes

Commentaires