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 :

[shell] Remplacement de valeur dans un fichier plat


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 19
    Points : 15
    Points
    15
    Par défaut [shell] Remplacement de valeur dans un fichier plat
    Bonjour,

    je souhaite remplacer des valeurs automatiquement et en masse dans un ficheir plat. Les champ de ce fichier sont séparés par des ';'.
    Imaginons que je veuille remplacer le 10ème champ par "00000,00" quand il vaut initialement "00000,01"; j'a donc voulu utiliser cette ligne de commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' '{gsub("00000,01","00000,00",$10); print $0}' $filenameIn > $filenameOut
    Cela fonctionne à peu près, si ce n'est que pour les lignes où a lieu le remplacement de valeur, les séparateurs de champs sont remplacés par des espaces.

    Qui plus est, quand j'aurai résolu ce souci, je souhaiterai pouvoir variabiliser la valeur à remplacer, la valeur de remplacement et le numéro de colonne (fixé ici à 10 arbitrairement... Vaste programme...

    Merci pour votre aide

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 266
    Points : 12 681
    Points
    12 681
    Par défaut
    Bonjour,
    Tu peux fournir des valeurs à des variables awk en entrée via l'option '-v'.

    Pour que ton séparateur de champs en sortie soit par exemple le ';', il suffit que tu initialises la variable awk OFS, se qui donnerait en exemple complet (pas testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F ';' -vXX="00000,00" 'BEGIN{OFS=";"}{gsub("00000,01",XX,$10); print $0}' $filenameIn > $filenameOut
    Cordialement.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Super, ça marche très bien (il faut juste mettre un espace entre le -v et le nom de la variable). Aussi bien le séparateur de champs que la variabilisation des valeur du remplacement.
    Il ne me manque que la possibilité de dynamiser le numéro de champ où effectuer l'opération

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par zoidberg Voir le message
    Il ne me manque que la possibilité de dynamiser le numéro de champ où effectuer l'opération
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -vTOTO="10" '{print $TOTO}'

  5. #5
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    Bonjour

    Si on sait que c'est le 10ème champ, pas besoin de gsub. (ou une valeur variabilisé comme l'a bien montré BufferBob)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F';' 'BEGIN{OFS=";"} ($10=="00000,01"){$10="00000,00";} 1' "$filenameIn" > "$filenameOut"
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 19
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -vTOTO="10" '{print $TOTO}'
    Oui, effectivement, cela fonctionne bien.



    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    Si on sait que c'est le 10ème champ, pas besoin de gsub. (ou une valeur variabilisé comme l'a bien montré BufferBob)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F';' 'BEGIN{OFS=";"} ($10=="00000,01"){$10="00000,00";} 1' "$filenameIn" > "$filenameOut"
    Le fait est que je veux dynamiser le champ à remplacer, cette solution n'est donc pas inéressante

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 538
    Points : 19 360
    Points
    19 360
    Par défaut
    et qu'est-ce qui t'empêche de faire un mix des deux réponses ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par zoidberg Voir le message
    Le fait est que je veux dynamiser le champ à remplacer, cette solution n'est donc pas inéressante
    Ben si!

    On peut variabiliser en utilisant des variables shell:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    myLine=10
    myFrom="00000,01"
    myTo="00000,00"
    awk -F';' 'BEGIN{OFS=";"} ($'${myLine}'=="'${myFrom}'"){$'${myLine}'="'${myTo}'";} 1' "$filenameIn" > "$filenameOut"
    Bon, d'accord, c'est moins beau (et surtout moins lisible) qu'avec -v...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 538
    Points : 19 360
    Points
    19 360
    Par défaut
    -1 pour le code.
    +1 pour son commentaire.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 238
    Points : 13 443
    Points
    13 443
    Par défaut
    +1 pour l'effort
    -1 pour "myLine" qui aurait dû s'appeler "myField" ou "myColumn".
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    +1 pour l'effort
    -1 pour "myLine" qui aurait dû s'appeler "myField" ou "myColumn".
    Tout à fait d'accord!
    Je ne sais pas ce qui m'est passé par la tête

    Citation Envoyé par N_BaH Voir le message
    -1 pour le code.
    +1 pour son commentaire.
    Merci bien!!!

    La solution avec -v est beaucoup plus lisible... et donc "supérieure"... quand elle marche!

    J'ai toujours une petite réticence à l'utiliser car je me souviens vaguement avoir eu des problèmes de portabilité en sortant du domaine linux (était-ce OSX, HPUX, AIX? je ne sais plus), ce qui n'est pas une excuse sur ce forum!

    Bref, je ne préconise pas ma proposition, mais ça peut éventuellement être un contournement à envisager uniquement lorsqu'on n'arrive pas à faire fonctionner le -v... et encore...

    Pour montrer que je peux aussi faire cet effort:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    myCol=10
    myFrom="00000,01"
    myTo="00000,00"
    awk -F';' -v myCol="${myCol}" -v myFrom="${myFrom}" -v myTo="${myTo}" 'BEGIN{OFS=";"} ($myCol==myFrom){$myCol=myTo;} 1' "$filenameIn" > "$filenameOut"
    Na!

    PS: sous OSX, awk réclame une espace après "-v".

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. script shell pour remplacer un mot dans un fichier
    Par MSM_007 dans le forum Linux
    Réponses: 2
    Dernier message: 17/06/2010, 21h37
  2. Valeurs pour variables dans un fichier plat
    Par lylau dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 11/01/2010, 17h17
  3. [XSLT] Remplacer une valeur dans un fichier XML
    Par NicoV dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 23/11/2009, 17h21
  4. Remplacement dans un fichier plat
    Par melmouj dans le forum Langage
    Réponses: 6
    Dernier message: 23/03/2007, 17h49
  5. remplacer un caractere dans un fichier
    Par ickis dans le forum C
    Réponses: 11
    Dernier message: 13/10/2003, 10h29

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