Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/07/2007, 16h28   #1
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Par défaut [bash] utilisation de CAT/AWK pour parser un fichier CSV

Bonjour,

J'aimerai parser un fichier CSV qui contient 3 colonnes.

J'ai essayé avec awk et une boucle for, mais cela ne fonctionne pas. J'aimerai aussi récupérer la valeur d'une colonne/ligne dans des variables $NOM, $PRENOM, $ PASSWORD pour effectuer un traitement par la suite.
Je pense que tout le traitement doit se faire dans une boucle final pour effectuer le traitement de toutes mes lignes/colonnes de mon fichier CSV

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
# file_read
 
for i in `cat /home/afourquemin/file.csv`
do
echo $i
 
$USER=`echo $i | awk '{ print $1 }'`
echo $USER
 
done
 
#cat /home/afourquemin/file.csv | awk '{ print $2 }'
#cat /home/afourquemin/file.csv | awk '{ print $3 }'
Merci d'avance
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 16h47   #2
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
La boucle me semble inutile puisque awk travaille ligne par ligne. Mais sans exemple, c'est difficile de se prononcer.

Donne-nous un exemple typique en expliquant bien ce que tu veux capturer.
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
:quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
Jabber: ripat at im.apinc.org
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 16h52   #3
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
ok désolé

fichier CSV :

Arnaud;stan;gtfED45
Toto;robert;4554d
Mickeal;dupont;554fd

ensuite j'aimerai pouvoir lire ce fichier ligne par ligne, en récupérant :

$PRENOM="arnaud"
$NOM="stan"
$PASSWORD="gtfED45"

pour ensuite traiter ces variables... jusqu'a la fin du fichier
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 18h04   #4
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Ça doit correspondre à ce que tu veux

Code :
1
2
3
4
5
6
7
8
9
10
11
for enreg in `cat /home/afourquemin/file.csv`
do
    echo $enreg
    USER=`echo $enreg | awk -F";" '{ print $1 }'`
    NOM=`echo $enreg | awk -F";" '{ print $2 }'`
    PASSWORD=`echo $enreg | awk -F";" '{ print $3 }'`
    echo "$USER - $NOM - $PASSWORD"
    #
    ### ton traitement
    #
done
__________________
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 19h15   #5
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
J'avais fais quelque chose de similaire, mais avec ton script, comme le mien, il y a une erreur :

line 5:syntax error near unexpected token 'do
line 5:'do
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 19h24   #6
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Je ne comprend pas pourquoi ca ne fonctionne pas ! J'ai un bouquin sous les yeux et ils écrivent le for de la même manière !!!
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 20h09   #7
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Citation:
Envoyé par arnaudperfect
J'avais fais quelque chose de similaire, mais avec ton script, comme le mien, il y a une erreur :

line 5:syntax error near unexpected token 'do
line 5:'do

Si tu pouvais mettre en ligne la partie de ton script posant problème, ce serait plus facile pour t'aider
__________________
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 20h26   #8
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
bah j'ai repris ton script en faite...
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 20h35   #9
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 945
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 945
Points : 1 083
Points : 1 083
Si tu veux juste récupérer une colonne, cut marche très bien aussi.
Si le but est de lire le fichier ligne par ligne, utiliser while read sera plus rapide et plus propre.

Le script de BlaireauOne marche bien chez moi (sous sh, bash et zsh). Je ne vois pas d'où peut venir le problème. Tu utilises bien Bash ?

Eventuellement, essaie ça :
Code :
1
2
3
4
5
6
7
while read enreg; do
    echo $enreg
    USER=`echo $enreg | cut -d';' -f1`
    NOM=`echo $enreg | cut -d';' -f2`
    PASSWORD=`echo $enreg | cut -d';' -f3`
    echo "$USER - $NOM - $PASSWORD"
done < /home/afourquemin/file.csv
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 20h36   #10
Membre expérimenté
 
Avatar de BlaireauOne
 
Inscription : mars 2007
Messages : 469
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : mars 2007
Messages : 469
Points : 576
Points : 576
Citation:
Envoyé par arnaudperfect
bah j'ai repris ton script en faite...
Un PB de copier/coller car chez moi, ça marche

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
cat > liste.txt <<EOD
Arnaud;stan;gtfED45
Toto;robert;4554d
Mickeal;dupont;554fd
EOD
 
for enreg in `cat liste.txt`
do
    echo $enreg
    USER=`echo $enreg | awk -F";" '{ print $1 }'`
    NOM=`echo $enreg | awk -F";" '{ print $2 }'`
    PASSWORD=`echo $enreg | awk -F";" '{ print $3 }'`
    echo "$USER - $NOM - $PASSWORD"
    #
    ### ton traitement
    #
done

Résultat :

Code :
1
2
3
4
5
6
7
 
Arnaud;stan;gtfED45
Arnaud - stan - gtfED45
Toto;robert;4554d
Toto - robert - 4554d
Mickeal;dupont;554fd
Mickeal - dupont - 554fd
__________________
Loi de Murphy:
La Théorie c'est quand ça ne marche pas mais que l'on sait pourquoi.
La Pratique c'est quand ça marche mais qu'on ne sait pas pourquoi.
Quand la théorie rejoint la pratique ça ne marche pas et on ne sait pas pourquoi.
BlaireauOne est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 20h41   #11
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
bah merde c'est bizarre !

oui j'utilise bash sous fedora !

je vais recopier le script !

j'avais le même problème au boulot sur une fedora aussi !!
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 20h50   #12
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
oué rien à faire, sur fedora aucun des scripts proposés ici ne marche...

Je ne comprend pas...
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 20h59   #13
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
bon, j'ai fais des petits exo sur le for,do,done pour me familliariser avec la syntaxe :

exemple :

Code :
1
2
3
4
5
6
ensemble="element1 element2 element3"
...
...
for var in $ensemble ; do
  echo $var
done
Sur notre script

Code :
1
2
3
4
5
6
7
8
9
10
11
for enreg in `cat /home/afourquemin/file.csv`
do
    echo $enreg
    USER=`echo $enreg | awk -F";" '{ print $1 }'`
    NOM=`echo $enreg | awk -F";" '{ print $2 }'`
    PASSWORD=`echo $enreg | awk -F";" '{ print $3 }'`
    echo "$USER - $NOM - $PASSWORD"
    #
    ### ton traitement
    #
done
je pense que le problème vient de `cat /home/afourquemin/file.csv`...

j'ai testé de faire :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
FICHIER=`cat /home/afourquemin/file.csv`
 
for enreg in $FICHIER
do
    echo $enreg
    USER=`echo $enreg | awk -F";" '{ print $1 }'`
    NOM=`echo $enreg | awk -F";" '{ print $2 }'`
    PASSWORD=`echo $enreg | awk -F";" '{ print $3 }'`
    echo "$USER - $NOM - $PASSWORD"
    #
    ### ton traitement
    #
done
mais tjr le même problème !

pourtant j'ai tester le cat et il semble bien fonctionné...
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 21h01   #14
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 945
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 945
Points : 1 083
Points : 1 083
Très étrange.

Que donne "bash --version" ?
Ni la version avec le for, ni celle avec le while ne fonctionnent ? Testes-tu en mode interactif ou par un script exécutable (essaie avec les deux) ?
Essaie de simplifier les exemples donnés pour trouver d'où vient l'erreur.

Code :
1
2
3
4
 
for i in 1 2 3 4; do
  echo $i
done
Est-ce que ce code fonctionne chez toi ?

EDIT: je viens de voir ta réponse entre temps. Si le problème vient du cat, est-ce que ça marche avec le while read ?
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 21h06   #15
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
tien une question,

si je fais :

Code :
1
2
3
4
5
6
7
8
9
#!/bin/bash
# file_read
FICHIER=`cat /home/afourquemin/file.cvs`
echo $FICHIER
 
Reponse :
./file_read: line 3: Jean;lapin;gjjfjdeje : command not found
 
fin
c'est normale le "command not found" ? et le blanc entre l'erreur et "fin"...
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 21h10   #16
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 945
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 945
Points : 1 083
Points : 1 083
Visiblement, on n'a vraiment pas la même version de Bash...

Essaie :
Code :
FICHIER=$(cat /home/afourquemin/file.cvs)
Comment appelles-tu ton script ? Pourquoi "fin" s'affiche ? La ligne vide, c'est parce que ton $FICHIER est vide (à cause de l'erreur). Essaie de donner des copier-coller exacts de ce que tu fais.
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 21h15   #17
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Code :
1
2
3
for i in 1 2 3 4; do
  echo $i
done
oui ca fonctionne !

bash --version :

GNU bash, version 3.1.17(1) - release (1686-redhat-linux-gnu)
Copyright (c) 2005 Free Software Foundation, Inc.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
# file_read
while read enreg; do
    echo $enreg
    USER=`echo $enreg | cut -d';' -f1`
    NOM=`echo $enreg | cut -d';' -f2`
    PASSWORD=`echo $enreg | cut -d';' -f3`
    echo "$USER - $NOM - $PASSWORD"
done < /home/root/scripts/file.csv
 
 
 
[root@localhost scripts]# ./file_read 
./file_read: line 9: syntax error near unexpected token `done'
./file_read: line 9: `done < /home/root/scripts/file.csv'
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 21h17   #18
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
Citation:
Envoyé par LLB
Code :
FICHIER=$(cat /home/afourquemin/file.cvs)
ca marche cette syntaxe !!! je vais testé avec le reste du script >

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
# file_read
FICHIER=$(cat /home/root/scripts/file.csv)
echo $FICHIER
 
for enreg in $FICHIER ; do
    echo $enreg
    USER=`echo $enreg | awk -F";" '{ print $1 }'`
    NOM=`echo $enreg | awk -F";" '{ print $2 }'`
    PASSWORD=`echo $enreg | awk -F";" '{ print $3 }'`
    echo "$USER - $NOM - $PASSWORD"
    #
    ### ton traitement
    #
done
 
 
 
[root@localhost scripts]# ./file_read 
Jean;lapin;ghsdfjkdf antoine;petit;54sfsdf Jean-François;Saint-James;55454df Mikeal;dubois;; emmanuel;grout;dfklpsdf arnaud;fourquemin;;
'/file_read: line 6: syntax error near unexpected token `do
'/file_read: line 6: `for enreg in $FICHIER ; do
le soucie va rester que j'espère que cette syntaxe soit portable...
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 21h32   #19
LLB
Membre Expert
 
Inscription : mars 2002
Messages : 945
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 945
Points : 1 083
Points : 1 083
Citation:
Envoyé par arnaudperfect
le soucie va rester que j'espère que cette syntaxe soit portable...
Je suppose que ce code va marcher aussi :
Code :
FICHIER="`cat /home/afourquemin/file.cvs`"
Personnellement, je préfère $( ).

Ton fichier d'entrée, c'est bien celui que tu avais donné avant ?

En protégeant bien les variables, ça donne :
Code :
1
2
3
4
5
6
7
while read enreg; do
    echo $enreg
    USER=$(echo "$enreg" | cut -d';' -f1)
    NOM=$(echo "$enreg" | cut -d';' -f2)
    PASSWORD=$(echo "$enreg" | cut -d';' -f3)
    echo "$USER - $NOM - $PASSWORD"
done < /home/root/scripts/file.csv
LLB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/07/2007, 21h34   #20
Membre actif
 
Homme Arnaud
Inscription : décembre 2006
Messages : 871
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 27
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2006
Messages : 871
Points : 195
Points : 195
je pense que les ; sont interprétés avec le for...

je vais tester tes lignes de codes
__________________
www.SonolightDj.com
Prestataire sonorisation et lumière
arnaudperfect est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h41.


 
 
 
 
Partenaires

Hébergement Web