La boîte à outils de Linux

Mais quel est le problème ?

On a parfois à utiliser, et cela est particulièrement vrai dans le cas de calculs scientifiques, des données qui ont été formatées pour différentes applications et/ou à des époques variées, voire archaiques (ères algolocène, fortranocène, etc...). Il est usuel d'avoir à utiliser des données initiales dans une première étape de traitement par un programme, dont la sortie sera utilisées pour alimenter un autre programme, lequel programme peut nécessiter un format de données différent. Dans ce cas il faut envisager un reformatage des données.

outilinux.png

Les outils des distributions Linux

Linux a hérité d'Unix toute une panoplie d'outils simples et efficaces pour agir sur les formats de données. Le principe est d'avoir un outil pour chaque usage, lequel ne fait qu'une chose mais la fait bien. Nous allons examiner ci-après quelques uns de ces utilitaires avec, à l'appui, quelques exemples de leur mise en oeuvre.

tr  sed  cut  paste  awk  

tr

Supposons que vous ayez des données dans un fichier test0.txt séparées par des blancs, comme ci-dessous. Ces groupes de caractères (mots) n'ont bien sûr pas de signification particulière et servent uniquement de matière de test.

Lorem ipsum dolor sit amet consectetuer adipiscing elit Sed non risus Suspendisse lectus tortor dignissim sit amet adipiscing nec ultricies sed dolor Cras elementum ultrices diam

Nous voulons remplacer les blancs par virgules, nous allons utiliser tr

$  tr [:blank:] "," test1.txt

Voilà comment se présente test1.txt

Lorem,ipsum,dolor,sit,amet,consectetuer,adipiscing,elit,Sed,non,risus,Suspendisse,lectus, tortor,dignissim,sit,amet,adipiscing,nec,ultricies,sed,dolor,Cras,elementum,ultrices,diam

Ou bien, pour un autre traitement, nous voulons des ! pour séparateur

$ tr "," "/!" test2.txt
Lorem!ipsum!dolor!sit!amet!consectetuer!adipiscing!elit!Sed!non!risus!Suspendisse!lectus! tortor!dignissim!sit!amet!adipiscing!nec!ultricies!sed!dolor!Cras!elementum!ultrices!diam

Supposons que pour quelque raison obscure nous souhations que notre fichier test1.txt soit converti en capitales

$ tr [:lower:] [:upper:] test3.txt
LOREM,IPSUM,DOLOR,SIT,AMET,CONSECTETUER,ADIPISCING,ELIT,SED,NON,RISUS,SUSPENDISSE,LECTUS, TORTOR,DIGNISSIM,SIT,AMET,ADIPISCING,NEC,ULTRICIES,SED,DOLOR,CRAS,ELEMENTUM,ULTRICES,DIAM

Il est bon de se souvenir des deux commandes suivantes :

$ man tr
$ tr --help

sed

On peut aussi utiliser sed (Stream Editor), lequel permet des substitutions en utilisant le paramètre s . Il permet aussi de faire des transformations plus complexes. Reprenons notre fichier test1.txt et remplaçons les virgules par des tabulations

$ sed -e "s/,/  /g" test1.txt >test4.txt
Lorem	ipsum	dolor	sit	amet	consectetuer	adipiscing	elit	Sed
non	risus	Suspendisse	lectus	tortor	dignissim	sit	amet
adipiscing	nec	ultricies	sed	dolor	Cras	elementum
ultrices	diam

Dans la commande, le blanc après le second / est un Tab que l'on entre au clavier par

CtrlV Tab

Pour plus d'informations sur l'usage de sed :

$ man sed
$ sed --help

cut

cut permet de sélectionner dans un fichier les champs que l'on désire conserver. Ainsi, reprenons notre fichier test1.txt duque nou_s nous souhaitons garder seulement les champs 5 à 10 inclus.

$ cut -f5-10 -d "," test1.txt >test5.txt
amet,consectetuer,adipiscing,elit,Sed,non

Le caractère qui suit le paramètre -d indique a cut quel est le séparateur dans le fichier d'origine. Si celui-ci est un Tab, c'est la valeur par défaut, dans ce cas le paramètre -d est inutile.
Dans la liste des champs, exemples : 1,2,3 indique les champs 1,2 et 3, 5-10 indique de 5 à 10 inclus, -10 indique du début jusqu'à 10, 10- indique de 10 à la fin. On trouve des notes sur la commande cut sur

http://www.computerhope.com/unix/ucut.htm

Pour les informations usuelles

$ man cut
$ cut --help

paste

On a parfois le problème inverse de celui ci-dessus. C'est à dire que l'on a plusieurs fichiers contenant des données de provenance distincte mais qui auront à subir un même traitement. Dans ce on utilise paste pour faire de plusieurs fichiers un fichier unique.

$ paste fichier1 fichier2 >fichier3

Dans ce cas simple, les données utilisent le séparateur par défaut Tab . Pour utiliser d'autres séparateurs on aura recours au paramètre -d comme ci-aprè dans le cas de la virgule. Il est sous-entenbdu qu fichier1 et fichier2 utilisent déjà ce séparateur.

$ paste -d "," fichier1 fichier2 >fichier3

Comme d'habitude, plus de détails dans

$ man paste
$ paste --help

awk

awk tire son nom de ses trois auteurs : Aho, Weinberger et Kernighan. Reprenons notre fichier test4.txt ci-dessus. Nous allons en extraire les champs 4, 5 et 6 que nous recueillerons dans le fichier test6.txt

$ awk '{print $4,$5,$6}' test0.txt >test6.txt
$ cat test6.txt
sit amet consectetuer

Voilà ! C'est aussi simple que cela. Si le fichier initial utilise la virgule comme séparateur de champs on peut le signaler à awk par l'option -F . L'absence de cette option conduirait à un fichier de sortie vide.

$ awk -F "," '{print $4,$5,$6}' test1.txt >test6.txt

On peut même réaliser des opérations arithmmétiques sur les champs sur une simple ligne de commande. Dans le cas ci-dessus, supposons que les champs 4, 5 et 6 soient des valeurs numériques, nous pouvons directement en faire la moyenne.

$ awk '{print $4+$5+$6/3}' test0.txt >test7.txt

awk est très puissant et constitue par lui-même un véritable langage de programmation, voir

$ man awk

On trouve des notes concernant la commande awk sur

http://www.ac-creteil.fr/reseaux/systemes/linux/shell-scripts/gawk.html

Pour en savoir plus sur les outils Unix/Linux


         
File: outils.html - Robert L.E. Billon, 2009-10-23 - Last update: 2012-02-03