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 13: Séparateurs en sortie

| Comments

Niveau : facile

La dernière fois on a vu les numéros de lignes, aujourd’hui on voit comment modifier les séparateurs de champ et d’enregistrement.

On continue donc avec un exemple trivial, on a ce fichier de données:

data.txt
1
2
3
1,a
2,b
3,c

On va intervertir les champs et modifier le séparateur de champs pour qu’il devienne un point-virgule (pour le nom des variables prédéfinie, je vous renvoie à l’article sur la gem English):

1
2
3
4
5
6
BEGIN {
  require 'English'
  $FS = ','
  $OFS = ';'
}
$_ = $F.reverse.join

join va utiliser automatiquement le contenu de $OFS:

1
2
3
4
[~]⇒ ruby -apl test1.rb data.txt
a;1
b;2
c;3

Parfois on veut aussi modifier le séparateur d’enregistrements (les enregistrements sont ici nos lignes du fichier). Par exemple, pour passer du caractère newline à ::

1
2
3
4
5
6
7
BEGIN {
  require 'English'
  $FS = ','
  $OFS = ';'
  $ORS = ':'
}
$_ = $F.reverse.join

Et le résultat:

1
2
[~]⇒ ruby -apl test1.rb data.txt
a;1:b;2:c;3:

Et bien sûr, si vous le voulez vraiment, vous pouvez toujours écrire ce script en une ligne, directement dans la console:

1
[~]⇒ ruby -aple 'BEGIN{$;=",";$,=";";$\=":"};$_=$F.reverse.join' data.txt

Mais êtes-vous sûr de vouloir faire ça ?!

À demain.

Articles connexes

Commentaires