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 :

Transformation d'un champ de fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Par défaut Transformation d'un champ de fichier
    Bonjour à tous,

    Je voudrais ajouter à la ligne de commandes ci-dessous une autre commande qui transforme le huitième champs de mon fichier par "0." si le premier caractère est un "."
    exemple : .334 deviendrait 0.334

    Pièce jointe 638036



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat BGC2MASTER_??????_CSV.CSV|tail -n +5|sed -e 's/"//g'|sed -e 's/~/-/g'|sed -e 's/;/~/g'|sed -e 's/  *~/~/g' > DSC_PCPE_S_MASTER_MATERIAL_LD.data
    Merci beaucoup de votre aide ;-)

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 673
    Par défaut
    Bonjour,

    dès que tu parles de "champs, dis-toi que le meilleur outil, c'est (G)awk.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{printf("%."length($8)-2"f\n",$8)}' tonFichier
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éclairé Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    dès que tu parles de "champs, dis-toi que le meilleur outil, c'est (G)awk.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{printf("%."length($8)-2"f\n",$8)}' tonFichier
    Merci de ta réponse N_BaH

    Pour être honnête, je ne comprends pas ce que fait cette commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{printf("%."length($8)-2"f\n",$8)}' tonFichier
    Comment puis-je l'intégrer à celle-ci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat BGC2MASTER_??????_CSV.CSV|tail -n +5|sed -e 's/"//g'|sed -e 's/~/-/g'|sed -e 's/;/~/g'|sed -e 's/  *~/~/g' > DSC_PCPE_S_MASTER_MATERIAL_LD.data
    En sachant que le délimiteur de mon fichier est "~"

    Voici une ligne du fichier de sortie après traitement à grands coups de sed :

    64626145~P&G Generation 600 SMS sticker~PC~140~70~10~98000~.002~.00~22000~191~22000~EUR~~0~~80141605~A~11

    Encore merci ;-)

  4. #4
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par défaut
    bonjour

    tu ne demandes pas simplement à remplacer ~. par ~0. ? Du coup, tu peux aussi traiter la colonne 9 (ou non)

    ps: il aurait été utile d'avoir au moins les mêmes lignes du fichier d'origine
    note : "cat BGC2MASTER_??????_CSV.CSV|tail -n +5" c'est simplement "tail -n +5 fichier"

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 295
    Par défaut
    Bonjour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F '-' -vOFS='-' '($8 ~ /^\./){$8="0"$8;} 1'

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    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 376
    Par défaut
    soit le sed suivant à la fin:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e 's/\(\([^~]*~\)\{7\}\)\./\10./'
    ou plus simple pour le profane, avant de transformer les ; en ~, c'est de juste transformer le 7ème ; en ~ et de faire le changement du . en 0. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... | sed -e 's/;/~/7'| sed  -e 's/~\./~0./'| sed  -e 's/;/~/g' | .....

  7. #7
    Membre éclairé Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Par défaut
    Citation Envoyé par papajoker Voir le message
    bonjour

    tu ne demandes pas simplement à remplacer ~. par ~0. ? Du coup, tu peux aussi traiter la colonne 9 (ou non)

    ps: il aurait été utile d'avoir au moins les mêmes lignes du fichier d'origine
    note : "cat BGC2MASTER_??????_CSV.CSV|tail -n +5" c'est simplement "tail -n +5 fichier"
    Oui effectivement la colonne 9 est à traiter aussi mais c'était pour simplifier la demande au maximum ;-)
    Voici une ligne du fichier d'origine --> attention ça pique

    "64626145 ";"P&G Generation 600 SMS sticker ";"PC ";"140";"70";"10";"98000";".002";".00";"22000";"191";"22000";"EUR";" ";"0";" ";"80141605 ";"A";"11"

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 673
    Par défaut
    tu ne l'intègres pas à ta ligne de commande, ça remplace ta ligne de commande.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ awk 'BEGIN{FS=OFS="~"} {$8 = sprintf("%."length($8)-1"f",$8)}1' <<<'64626145~P&G Generation 600 SMS sticker~PC~140~70~10~98000~.002~.00~22000~191~22000~EUR~~0~~80141605~A~11'
    64626145~P&G Generation 600 SMS sticker~PC~140~70~10~98000~0.002~.00~22000~191~22000~EUR~~0~~80141605~A~11
    $
    c'est quand même plus facile de donner une commande qui fonctionne avec un extrait de fichier !

    tu peux aussi supprimer le tail en testant, dans awk la variable NR qui renvoie le numéro de la ligne courante.

    awk est un langage à part entière, comme le shell, ou sed, perl, python...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 324
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    awk est un langage à part entière, comme le shell, ou sed, perl, python...
    une version python (dans un script bash) serait par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo -e 'toto;tata;.45\n"maman";"papa";.789' | python -c 'import sys; t=sys.stdin.read().replace(";.", ";0.").split(";"); print("~".join(x.replace("\"","") for x in t))'
    note: utilité ici nulle et plus lente (mais si on ne connait que ce langage : ok) donc, donné uniquement pour info !

  10. #10
    Membre éclairé Avatar de zemeilleurofgreg
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    515
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 515
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    tu ne l'intègres pas à ta ligne de commande, ça remplace ta ligne de commande.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ awk 'BEGIN{FS=OFS="~"} {$8 = sprintf("%."length($8)-1"f",$8)}1' <<<'64626145~P&G Generation 600 SMS sticker~PC~140~70~10~98000~.002~.00~22000~191~22000~EUR~~0~~80141605~A~11'
    64626145~P&G Generation 600 SMS sticker~PC~140~70~10~98000~0.002~.00~22000~191~22000~EUR~~0~~80141605~A~11
    $
    c'est quand même plus facile de donner une commande qui fonctionne avec un extrait de fichier !

    tu peux aussi supprimer le tail en testant, dans awk la variable NR qui renvoie le numéro de la ligne courante.

    awk est un langage à part entière, comme le shell, ou sed, perl, python...
    Pas super simple à comprendre pour un novice, mais c'est puissant
    Donc ça donnerait un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{FS=OFS="~"} {$8 = sprintf("%."length($8)-1"f",$8)}1' > DSC_PCPE_S_MASTER_MATERIAL_LD.data
    Correct ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 673
    Par défaut
    Citation Envoyé par zemeilleurofgreg Voir le message
    Donc ça donnerait un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{FS=OFS="~"} {$8 = sprintf("%."length($8)-1"f",$8)}1' > DSC_PCPE_S_MASTER_MATERIAL_LD.data
    Correct ?
    sans oublier le fichier de données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{FS=OFS="~"} {$8 = sprintf("%."length($8)-1"f",$8)}1' fichierDonnées >fichierSortie
    NB: certaines versions de awk (au moins Gawk) ont une option inplace.
    contrairement à sed, je lui ai pas trouvé vu la possibilité d'effectuer une sauvegarde du fichier original. :/
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

Discussions similaires

  1. Transformation d'un champ de fichier
    Par zemeilleurofgreg dans le forum Unix
    Réponses: 1
    Dernier message: 29/04/2023, 11h46
  2. Ajout de champs de fichiers
    Par dim971 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/07/2006, 22h40
  3. Réponses: 7
    Dernier message: 29/06/2006, 12h33
  4. Caractères transformés dans les chemins de fichier
    Par canabral dans le forum Langage
    Réponses: 4
    Dernier message: 15/12/2005, 15h24
  5. test champs de fichier
    Par philippe123 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/08/2005, 15h16

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