zerros a écrit :
je me répond à moi même, mais si vous avez un meileur code, ca m'interesse. Le traitement ssera plus rapide
Voilà donc ma solution :
#!/bin/sh
FILE=`cat toto.txt`
for X in $FILE
do
Y=`echo $X | cut -d : -f 1`
Z=`echo $X | cut -d : -f 2`
echo "$Y --> $Z"
done
|
Ton code est celui qu'on trouve généralement soi-même au début du shell car on n'a pas l'habitude de manipuler mais il y a des codes bien meilleurs (et entre parenthèses, la variable $FILE est inutile => for X in `cat toto.txt`). Et accessoirement, utiliser des noms de variables significatifs donne de suite un code bien meilleur => for lig in ...
En fait, le problème du for est qu'il découpe ses éléments sur l'espace. Si ton fichier contient des lignes sans espace ça marche sinon ça te coupe les lignes. Donc la solution c'est d'utiliser un truc qui ne prenne pas en compte les espaces. Le meilleur c'est read car lui se cale sur le <return> (et toute ligne finit par un <return> ) en lui demandant de traiter non pas le clavier mais le fichier.
Exemple 1: redirection de l'entrée standard
Code :
#!/bin/sh while read lig do host=`echo $lig | cut -d: -f1` ip=`echo $lig | cut -d: -f2` echo "$host --> $ip" done <toto.txt
|
Exemple 2: envoi des infos via pipe
Code :
#!/bin/sh cat toto.txt |while read lig do host=`echo $lig | cut -d: -f1` ip=`echo $lig | cut -d: -f2` echo "$host --> $ip" done
|
Exemple 3: création d'un nouveau canal IO
Code :
#!/bin/sh # Création du canal exec 3<toto.txt # On peut même supprimer le fichier car il a été mémorisé rm -f toto.txt # Lecture du canal 3 while read lig 0<&3 do host=`echo $lig | cut -d: -f1` ip=`echo $lig | cut -d: -f2` echo "$host --> $ip" done
|
L'avantage de cette soluce est que
1) pas de pipe donc pas de sous-processus (dans l'exemple 2, si t'affiches "$ip" à la fin de la boucle t'auras rien car les variables auront été remplies dans le sous-processus
2) on peut l'étendre pour traiter plusieurs fichiers en parallèle
Code :
- #!/bin/sh
- # Création des canaux sur chaque fichier à lire
- exec 3<toto.txt
- exec 4<titi.txt
- # Boucle de lecture
- while true
- do
- # Lecture du fichier 1
- read lig1 0<&3
- # Lecture du fichier 2
- read lig2 0<&4
- # Condition de sortie (par exemple une des deux variables vides ce qui indique un EOF sur un des deux fichiers)
- test -z "$lig1" -o -z "$lig2" && break
- # Traitement des lignes
- echo "$lig1 $lig2"
- done
|
Message édité par Sve@r le 09-08-2008 à 08:50:45
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.