IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Modifier plusieurs champs dans un fichier Csv


Sujet :

Shell et commandes GNU

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 72
    Points : 45
    Points
    45
    Par défaut Modifier plusieurs champs dans un fichier Csv
    Bonjour à tous,

    Je fais un script pour automatiser des taches administratives sous linux.
    Actuellement, je bloque sur un problème de modification de champs. Je ne vois pas d'où cela vient.

    Je souhaite remplacer certain champs vide par XX. Pour l'exemple, je n'utilise que de champs mais mes lignes contiennent 40 champs. Je dois en modifier une petite dizaine.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #!/bin/bash
     
    ...
    # création du fichier et initialisation de la variable tmp
    echo > $nouveau fichier
    tmp=''
     
    # Lecture du fichier ligne par ligne
    for ligne in $(cat test.csv)
    do
    # Modification des champs 3 et 4
    for c in 3 4 ;
    do
     
    # Selectionne une cellule
    cel=$(echo $ligne | awk -F";" '{print $'$c'}')
     
    # Test de la cellule
    if [[ "$cel" == "" ]]
       then # Elle vide, j'atribue XX
              tmp=$(echo $ligne | awk -F";" 'BEGIN { OFS=";" }{$'sc'="XX"; print $0}')
              echo $tmp >> $nouveaufichier
              cat $nouveaufichier > test.csv
              tmp=''
    fi
    done
    done
    le fichier test.csv avant
    aa;bb;;;
    aa;bb;;dd,
    aa;bb;cc;;

    le resultat :

    aa;bb;xx;;
    aa;bb;;xx;
    aa;bb;xx;dd,
    aa;bb;cc;xx;

    2 problèmes apparaissent :
    Une première ligne vide (je ne vois pas d'où elle sort.
    le resultat pour la ligne aa;bb;;; qui devrait etre aa;bb;xx;xx;

    Quelqu'un voit-il le problème dans mon code ?

    merci d'avance

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Heu...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    cat francois_a.dat
    aa;bb;;;
    aa;bb;;dd,
    aa;bb;cc;;
     
    sed ':boucle1; s/;;/;xx;/; t boucle1' francois_a.dat
    aa;bb;xx;xx;
    aa;bb;xx;dd,
    aa;bb;cc;xx;
    non ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 72
    Points : 45
    Points
    45
    Par défaut
    Oui j'étais parti sur cette solution au départ. Une bonne ligne en sed et c'était réglé.
    Mais car il y a un mais, certain champs doivent rester vide.

    Par contre je ne vois pas à quoi correspond ce qui encadre s/;;/;xx;/;

    :boucle1; et t boucle1

  4. #4
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Une première ligne vide (je ne vois pas d'où elle sort.
    ici peu etre...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
    
    ...
    # création du fichier et initialisation de la variable tmp
    
    echo > $nouveau fichier
    
    tmp=''
    ....

    pour avoir un fichier vraiment vide tu peux utiliser juste (sans l'echo)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    > nouveauFichier.txt
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  5. #5
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    si une substitution est opérée, t redirige vers le label boucle1 répéré par les :
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Autrement

    As-tu penser a utiliser IFS pour parser tes lignes?

    petit exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #!/bin/bash
    IFS=$','
    vals='/mnt,/var/lib/vmware/VirtualMachines,/dev,/proc,/sys,/tmp,/usr/portage,/var/tmp'
    for i in $vals; do echo $i; done
    unset IFS
    et set -x pour tracer l'execution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    set -x
    .... le code que je veux tracer
    set +x
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 72
    Points : 45
    Points
    45
    Par défaut
    Merci pour le echo !!! Je suis tête en l'air par moment !!!

    Sinon concernant IFS, je ne vois pas trop l'intérêt.

    J'ai une idée mais je ne sais pas comment la mettre en oeuvre.

    Il me semble que lorsque l'on utilise un pipe les variables reste les même.
    Mon idée serai de faire un script qui renverrai çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #!/bin/bash
     
    ...
    # création du fichier et initialisation de la variable tmp
    > $nouveau fichier
    tmp=''
     
    # Lecture du fichier ligne par ligne
    for ligne in $(cat test.csv)
    do
    # Modification des champs 3 et 4
    tmp=$(echo $ligne |for c in 3 4 ;
             do
     
            # Selectionne une cellule
            cel=$(echo $ligne | awk -F";" '{print $'$c'}')
     
            # Test de la cellule
            if [[ "$cel" == "" ]]
               then # Elle vide, j'atribue XX
                       awk -F";" 'BEGIN { OFS=";" }{$'sc'="XX"; print $0}')
                      echo $tmp >> $nouveaufichier
                      cat $nouveaufichier > test.csv
                      tmp=''
            fi
            done)
    done

    bien sur j'ai testé et çà ne passe pas

  8. #8
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Un truc comme ça (je n'ai pas de shell sous la main, mais l'esprit y est)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    #!/bin/bash
     
    ...
    # création du fichier et initialisation de la variable tmp
    > $nouveau fichier
    tmp=''
     
    # Lecture du fichier ligne par ligne
    for ligne in $(cat test.csv)
    do
    # Modification des champs 3 et 4
    IFS=;
    echo "$line" | read array[1] array[2] array[3] array[4] array[5] 
    IFS=" "
     
      for index in 3 4 
      do
         if [[ "X${array[index]" == "X" ]]
         then
            array[index]="XX"
         fi
      done 
    echo "${array[1]};${array[2]};....." > fichiercible.csv
    done
    mes deux sources d'inspiration pour cette idée
    http://www.linuxtopia.org/online_boo...de/arrays.html
    http://www.unix.com/shell-programmin...tion-bash.html
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Ah, ouais... !

    Je me permet de 'transcrire' ce que, s'il avait eu un shell, Jabbounet aurait écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/bash
    
    No_champs=( 2 3 ) # soit les n° des champs souhaités moins un : les arrays commencent à 0
    
    while read ligne
     do
       IFS=";" read -a Champs <<< "$ligne"
    
       for indice in ${No_champs[@]}  
        do
          test -z ${Champs[indice]} && Champs[indice]="xx"
       done
    
       var=$(printf '%s;' ${Champs[@]})
       echo "$var" >> fichiercible.csv
    
    done < fichier.csv
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Un one-liner awk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{FS=OFS=";"}{$3=$3?$3:"xx";$4=$4?$4:"xx"}1' fichier
    :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

  11. #11
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Ah, ouais... !

    Je me permet de 'transcrire' ce que, s'il avait eu un shell, Jabbounet aurait écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/bash
    
    No_champs=( 2 3 ) # soit les n° des champs souhaités moins un : les arrays commencent à 0
    
    while read ligne
     do
       IFS=";" read -a Champs <<< "$ligne"
    
       for indice in ${No_champs[@]}  
        do
          test -z ${Champs[indice]} && Champs[indice]="xx"
       done
    
       var=$(printf '%s;' ${Champs[@]})
       echo "$var" >> fichiercible.csv
    
    done < fichier.csv
    merci , c'est même plus joli que ce que j'aurais fait
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Le script bash plus haut est une solution élégante pour les petits fichiers de données. Pour des fichiers plus importants, (n|m)awk convient mieux. Je développe mon one-liner pour le rendre plus opérationnel dans le contexte d'une liste de champs à modifier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
      #!/bin/bash
     
     awk '
     BEGIN{
    	# définition des séparateurs entrée et sortie
    	FS=OFS=";"
     
    	# liste des champs à modifier
    	split("3-4", p, "-")
    }
    {
    	# modification des champs
    	for(i in p) $p[i]=$p[i]?$p[i]:"xx"
     
    	# impression
    	print > "fichier.out"
    }' fichier.in
    Testé sur un fichier.in de 6000 lignes:
    bash:
    real 0m4.181s
    user 0m1.268s
    sys 0m1.652s

    awk
    real 0m0.058s
    user 0m0.056s
    sys 0m0.008s

    awk est presque 100x plus rapide.
    :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

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 72
    Points : 45
    Points
    45
    Par défaut
    Merci à tous,

    Je viens de passer une bonne partie de la journée à décrypter tous çà et à essayer d'intégré les différentes méthode dans mon code mais sans succès...

    Pour N_BaH & jabbounet :
    Ne manque t il pas une commande pour rétablir IFS ? Et je n'ai pas reussit à le faire tourner sous mon script. Je n'ai que des ";" qui apparaissent.

    Pour ripat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{FS=OFS=";"}{$3=$3?$3:"xx";$4=$4?$4:"xx"}1' fichier
    Ce code fait exatement ce que je veux sauf qu'il est pas trés pratique quand on a plusieurs champs comme tu l'as remarqué.
    J'ai donc essayé ton code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/bash
     
     awk '
     BEGIN{
    	# définition des séparateurs entrée et sortie
    	FS=OFS=";"
     
    	# liste des champs à modifier
    	split("3-4", p, "-")
    }
    {
    	# modification des champs
    	for(i in p) $p[i]=$p[i]?$p[i]:"xx"
     
    	# impression
    	print > "fichier.out"
    }' fichier.in
    Mais j'obtiens une erreur.

    J'ai essayé de partir de ton code qui fonctionne pour retrouver un code qui ressemble mais sans résultat.
    Ne manque-t'il pas un $ devant les i ?

    Autre question comment fais tu pour connaître le temps d'exécution des scripts et que son Real, sys et user ?


    Merci en tout cas pour vos réponses et votre aide

  14. #14
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Citation Envoyé par francois_a
    Ne manque t il pas une commande pour rétablir IFS ?
    Dans ce contexte (sans ' ; ' entre l'affectation de l'IFS et la commande read) IFS est une 'variable d'environnement' pour la commande read uniquement.
    Comme, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    LC_ALL=C date; date
    Sun Aug 30 00:08:29 CEST 2009
    dimanche 30 août 2009, 00:08:29 (UTC+0200)
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par francois_a Voir le message
    Pour ripat :
    J'ai donc essayé ton code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/bash
     
     awk '
     BEGIN{
    	# définition des séparateurs entrée et sortie
    	FS=OFS=";"
     
    	# liste des champs à modifier
    	split("3-4", p, "-")
    }
    {
    	# modification des champs
    	for(i in p) $p[i]=$p[i]?$p[i]:"xx"
     
    	# impression
    	print > "fichier.out"
    }' fichier.in
    Mais j'obtiens une erreur.
    Quel message d'erreur, quelle version de awk? Essaye nawk ou mawk selon la version fournie par ta distribution. Mais, à ma connaissance ça devrait tourner avec toutes les versions. Je vais tester.

    Citation Envoyé par francois_a Voir le message
    J'ai essayé de partir de ton code qui fonctionne pour retrouver un code qui ressemble mais sans résultat.
    Ne manque-t'il pas un $ devant les i ?
    Non. dans l'expression $p[i], i est l'indice du tableau scalaire p contenant le n° des champs à modifier. Dans awk, les variables et tableaux n'ont pas de $. Celui-ci est réservé à l'identification des champs "parsés".

    Citation Envoyé par francois_a Voir le message
    Autre question comment fais tu pour connaître le temps d'exécution des scripts et que son Real, sys et user ?
    Simplement en ajoutant la commande "time" devant la commande à chronométrer:

    Pour la signification de user et sys, je ne sais pas trop. On utilise généralement real comme valeur de chronométrage.

    Edit
    J'ai testé le code plus haut sans erreur avec toutes les versions de awk disponibles sur ma distro: gawk (GNU awk), mawk et original-awk
    1. gawk Version*: 1:3.1.5.dfsg-4.1
    2. mawk Version*: 1.3.3-11.1
    3. original-awk Version*: 1.3.3-11.1
    :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

  16. #16
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par ripat Voir le message
    Le script bash plus haut est une solution élégante pour les petits fichiers de données. Pour des fichiers plus importants, (n|m)awk convient mieux. Je développe mon one-liner pour le rendre plus opérationnel dans le contexte d'une liste de champs à modifier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
      #!/bin/bash
     
     awk '
     BEGIN{
    	# définition des séparateurs entrée et sortie
    	FS=OFS=";"
     
    	# liste des champs à modifier
    	split("3-4", p, "-")
    }
    {
    	# modification des champs
    	for(i in p) $p[i]=$p[i]?$p[i]:"xx"
     
    	# impression
    	print > "fichier.out"
    }' fichier.in
    Testé sur un fichier.in de 6000 lignes:
    bash:
    real 0m4.181s
    user 0m1.268s
    sys 0m1.652s

    awk
    real 0m0.058s
    user 0m0.056s
    sys 0m0.008s

    awk est presque 100x plus rapide.
    Effectivement awk est plus rapide, mais est-ce le but d'un script?
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    Effectivement awk est plus rapide, mais est-ce le but d'un script?
    Ça, c'est à chacun de décider.

    Personnellement j'essaye d'utiliser l'outil plus adapté pour un problème donné.

    This is the Unix philosophy: Write programs that do one thing and do it well

    Dans le cas posé par l'OP, il s'agit de "parser" un fichier de données. Même si ce fichier ne fait que quelques lignes, il sera plus efficace d'utiliser awk qu'un script shell avec un read dans une boucle. Pour des fichiers de données de plusieurs centaines de milliers de lignes on passe de quelque heures de traitement à quelques minutes. Et là, ça compte.

    awk est imbattable pour ce type de problème. Pour un langage interprété je veux dire. Plus rapide que perl qui n'a pourtant pas la réputation d'un escargot. Comme c'est un langage concis, il permet d'écrire très vite des choses complexes mais dans sa spécialité: le traitement de fichiers ligne par ligne. J'ai bien vu, un jour, un traitement de texte écrit en awk, ou mieux, un mini serveur http embarqué sur un router mais il n'est pas le meilleur outil pour ça.
    :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

  18. #18
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Oui, c'est le gros avantage des unix et unix like , il n'y a pas qu'une seule façon de procéder. Chacun est libre de ses choix.

    Autrement pour revenir au contexte initial (il n'ya pas 15^3 millions de lignes a parser)
    Je souhaite remplacer certain champs vide par XX. Pour l'exemple, je n'utilise que de champs mais mes lignes contiennent 40 champs. Je dois en modifier une petite dizaine.
    Donc qu'importe l'outil (shell, awk, perl, ...) du moment que le résultat est là dans un délai raisonnable.

    Autrement je ne veux pas lancer un troll, mais rester strictement en bash aura l'avantage d'être plus portable (awk peu ne pas être installé sur toutes les plate formes qu'il a sous la main qui doivent utiliser ce script). Donc après le choix va dépendre des contraintes.

    Le plus important restant qu'il sache/comprenne ce qu'il fasse
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 72
    Points : 45
    Points
    45
    Par défaut
    Bonjour à tous,
    Désolé de ne pas avoir répondu avant, je suis sur plusieurs et j’essaie de tous les gérer en même temps.

    jabbounet/N_Bah : Merci pour les informations sur les variables d’env. Je ne connaissais pas ces subtilités. Votre script marche très bien

    Ripat :
    Alors je suis sur une machine virtuelle qui tourne sous Debian version 5.0.2, mais mon script devra tourner sous une Red Hat et/ou une Mandriva. A priori, je tourne sous mawk version 1.3.3.

    L’erreur que j’ai, c’est « awk : line1 : syntax error at or near print ». Je n’ai plus d’erreur quand je mets un ; avant le print je n’ai aucun résultat.

    Merci pour la commande time

  20. #20
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2009
    Messages : 72
    Points : 45
    Points
    45
    Par défaut
    jabbounet/N_Bah :
    Je ne m'étais pas aperçu que le script ne fonctionnait pas correctement.

    En effet, avec un fichier de départ qui ressemble à çà :
    aa;bb;;;
    aa;bb;;dd;
    aa;bb;cc;;

    J'obtiens ceci :

    aa;bb;xx;xx; <= ok
    aa;bb;dd;xx; <= pas ok, mon champ est décalé
    aa;bb;cc;xx;xx; <= un champ est ajouté

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Modifier un champ dans un fichier texte
    Par Klyre dans le forum LabVIEW
    Réponses: 7
    Dernier message: 03/06/2015, 14h28
  2. [CSV] Insérer des champs dans un fichier CSV
    Par floctc dans le forum Langage
    Réponses: 1
    Dernier message: 20/07/2009, 11h26
  3. spool plusieurs requète dans même fichier csv
    Par hichcasa dans le forum Sql*Plus
    Réponses: 1
    Dernier message: 02/03/2009, 12h27
  4. [CSV] Modifier un champ d'un fichier CSV
    Par BernardT dans le forum Langage
    Réponses: 3
    Dernier message: 04/07/2007, 10h13
  5. Réponses: 3
    Dernier message: 26/04/2006, 11h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo