Différents outils de Linux sont très doués pour travailler avec des lignes, mais pas avec des colonnes (c'est leur rôle) Sed, Awk, Grep, etc.
Cependant, il peut arriver pour X raisons que vous ayez un fichier où les données sont à lire en colonnes
Un exemple simple:
$ cat in.txt
2008-09-21|2008-09-22|2008-09-23
Dimanche|Lundi|Mardi
Solution
Voici une méthode "simple" pour transformer ce fichier en un fichier de 3 lignes de deux colonnes (date|nom du jour)
$ split -l1 in.txt tmp_
$ sed -i 's/|/\x0A/g' tmp_
$ paste -d'|' tmp_* >out.txt
$ rm -f tmp_*
$ cat out.txt
2008-09-21|Dimanche
2008-09-22|Lundi
2008-09-23|Mardi
Jetez un oeil aux pages man de
split et
paste, ce sont deux commandes simples, mais Ô combien pratiques :-)
Limitations
- Sous cette forme, le script ne fonctionnera que si le nombre de lignes en entrée est inférieur à 676. Cela est dû au suffixe ajouté par la commande split qui ne comporte par défaut que 2 caractères, mais en cas de besoin, l'option -a permet d'augmenter cette limite.
- Pour la commande sed (qui peut-être changée par d'autres commandes assez simplement) selon les versions, deux problèmes peuvent se poser:
- L'option -i exige un suffixe (.bak, ou autre) en ce cas, il faut bien faire attention à modifier la commande paste pour ne prendre en compte que les fichiers générés par split et non ceux par sed (tmp_?? par exemple)
- La version ne supporte pas la notation octale '\012' ou hexadécimale '\x0A' dans ce cas, le plus simple que j'ai trouvé, c'est d'échapper le retour chariot comme suit: taper un backslash, puis les deux combinaisons suivantes <Ctrl+V> <Ctrl+J>(ou appuyer sur entrée), puis terminer la commande.