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.

Remplacer Sed et Awk par Ruby 2: Premiers pas

| Comments

Niveau : facile

Vous avez décidé de remplacer Sed et Awk par Ruby ? C’est parti. L’objectif de cet article sera de calculer et d’afficher la somme des valeurs contenues dans un fichier.

Prenons le simple fichier de données (data.txt) suivant:

data.txt
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9

Hello world!

Le premier pas sera d’afficher chaque ligne du fichier de données. Voici le script Ruby qui va faire ça:

test1.rb
1
puts $_

La variable $_ est une variable prédéfinie qui contient la ligne en cours de traitement. Dans l’article précédent, j’évoquai la boucle de traitement implicite. Pour dire à Ruby d’utiliser cette boucle implicite, on doit utiliser l’option -n sur la ligne de commande:

1
2
3
4
5
6
7
8
9
10
[~]⇒ ruby -n test1.rb < data.txt
1
2
3
4
5
6
7
8
9

BEGIN et END

Pour calculer la somme des valeurs du fichier, il va falloir initialiser une variable avant la boucle de traitement et l’afficher après la boucle de traitement. Pour ça, Ruby reprend ce que fait Awk avec les blocs BEGIN {} et END {}:

one_shot.rb
1
2
3
4
5
BEGIN { total = 0 }

total += $_.to_i

END { puts total }

Le code placé dans un bloc BEGIN est executé avant tout autre code du fichier. Celui placé dans un bloc END est executé après tout autre code du fichier. Objectif atteint:

1
2
[~]⇒ ruby -n one_shot.rb < data.txt
45

Il faut noter qu’on a réussi notre objectif sans avoir explicitement à ouvrir le fichier et à lire chaque ligne.

À demain.

Articles connexes

Commentaires