OVH Cloud OVH Cloud

Valeur avec espace

6 réponses
Avatar
ozzii
Bonjour,
j'ai un soucis lors de la recuperation de valeur.

Je parcour un fichier toto.txt qui contient par exemple:
1:2:5 8 9

Je fait:
for X in `cat toto.txt`
do
a=`echo $X|cut -d':' -f1`
b=`echo $X|cut -d':' -f2`
c=`echo $X|cut -d':' -f3`
done

le probleme c'est que dans le $c je n'ai que 5
Comment faire pour avoir 5 8 9 dans le $c ??

6 réponses

Avatar
Dam
Chez moi, ça marche...
Avatar
Stephane Chazelas
On 11 Jan 2006 02:40:30 -0800, ozzii wrote:
Bonjour,
j'ai un soucis lors de la recuperation de valeur.

Je parcour un fichier toto.txt qui contient par exemple:
1:2:5 8 9

Je fait:
for X in `cat toto.txt`
do
a=`echo $X|cut -d':' -f1`
b=`echo $X|cut -d':' -f2`
c=`echo $X|cut -d':' -f3`
done

le probleme c'est que dans le $c je n'ai que 5
Comment faire pour avoir 5 8 9 dans le $c ??
[...]


IFS=: read -r a b c junk < toto.txt

regles basiques de shell:

- Ne pas utiliser "echo"
- ne pas laisser de variables unquotees a moins d'avoir une
bonne raison
- quand on laisse une variable ou une command substitution
(`...` ou $(...)) unquotee, s'assurer que IFS est ce qu'on
veut et lancer un "set -f" avant.
- eviter les boucles, surtout pour processer du texte (utiliser
un outil comme awk, sed...)

awk -F: '
{
# ce que tu veux avec $3 comme:
print $3
}' < toto.txt

--
Stephane

Avatar
ozzii
Je vais tester cela demain car je ne suis plus au boulot.
Avatar
ozzii
Petite question:
Quelle est la différence entre l'utilisation de boucle et du awk pour
parcourir un fichier ??
Est-ce qu'avec un "while read" c'est parreil ??

Merci
Avatar
Xavier Gachon
Le 11-01-2006, ozzii a écrit :
Quelle est la différence entre l'utilisation de boucle et du awk pour
parcourir un fichier ??


Les shells etant des langages de commandes le corp des boucles
implique souvent le lancement de multiples commandes externes
pour chaque traitement là ou awk & co prennent generalement
en charge l'integralité des traitements en une commande, la
difference en terme de temps machine peut rapidement devenir
non negligeable. Evidemment lorsque l'integralité des traitements
sont faits dans le shell sans appel a des commandes externes les
memes considerations de performances s'applique alors du point de
vue des implementations des shells eux meme vis a vis de langages
ou commandes specialisés du type awk, sed, etc; En pratique les
shells ne sont generalement pas des foudres de guerres (c'est rien
de le dire :).

Est-ce qu'avec un "while read" c'est parreil ??


oui, et dans ton exemple cela evite d'avoir a subir l'influence
de l'IFS, là aussi l'utilisation d'un langage/d'une commande
moins lié a l'environnement du shell permettant de la lancer
evite des surprises :)

xavier

Avatar
Ozzii
Xavier Gachon écrivait
news::

Le 11-01-2006, ozzii a écrit :
Quelle est la différence entre l'utilisation de boucle et du awk pour
parcourir un fichier ??


Les shells etant des langages de commandes le corp des boucles
implique souvent le lancement de multiples commandes externes
pour chaque traitement là ou awk & co prennent generalement
en charge l'integralité des traitements en une commande, la
difference en terme de temps machine peut rapidement devenir
non negligeable. Evidemment lorsque l'integralité des traitements
sont faits dans le shell sans appel a des commandes externes les
memes considerations de performances s'applique alors du point de
vue des implementations des shells eux meme vis a vis de langages
ou commandes specialisés du type awk, sed, etc; En pratique les
shells ne sont generalement pas des foudres de guerres (c'est rien
de le dire :).

Est-ce qu'avec un "while read" c'est parreil ??


oui, et dans ton exemple cela evite d'avoir a subir l'influence
de l'IFS, là aussi l'utilisation d'un langage/d'une commande
moins lié a l'environnement du shell permettant de la lancer
evite des surprises :)

xavier




Merci pour vos reponses.
J'utilise while ou awk.

Merci