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

Linux Discussion :

[Awk] Afficher une partie d'un séparateur de champs


Sujet :

Linux

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Points : 13
    Points
    13
    Par défaut [Awk] Afficher une partie d'un séparateur de champs
    Bonjour à tous

    je dois traiter un fichier texte (toto.txt) qui contient des lignes de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    947924674,PRESSE,2008-08-03,le roi est là\,mais oui,<autres champs séparés par des virgules>
    J'utilise le programme Awk suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    awk 
    'BEGIN 
    { FS = "\([^\\\]\),";} 
    { print $4; }' 
    toto.txt
    Je définis donc le séparateur de champs comme étant "," mais pas "\," (c'est un export de base de données vers un fichier csv ou j'ai spécifié que "," était le séparateur de champs)

    Le problème c'est que l'expression régulière du field separator me bouffe une lettre (normal) et que je n'arrive pas à utiliser les expressions régulières "marquées" en utilisant les parenthèses

    Comment est-ce que je pourrais faire ?

    Pour info le résultat à ma commande est le suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    le roi est là\,mais ou
    (notez le i tronqué à la fin de "mais oui")

    D'avance merci à ceux qui trouveront un peu de temps pour me guider la-dessus !

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 711
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    T'es sûr que tu veux le faire en awk ? Parce que j'ai une solution en Python

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/usr/bin/env python
    # coding: Latin-1 -*-
     
    fp=open(fichier, "r")
     
    for lig in fp:
        print lig.replace("\,", "\\").split(",")[3].replace("\\", "\,")
     
    fp.close()
    Sinon il y a une solution qui permet d'utiliser awk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/\\\\,/\\\\\\\\/g" fichier |awk -F, '{print $4}' |sed -e "s/\\\\\\\\/\\\\,/g"
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Je préfèrerais awk (ou sed), je n'ai pas trop l'habitude d'utiliser du python

    Sinon je vois que tu substitues les chaînes pour pouvoir passer outre, c'est une bonne idée mais je risque de me retrouver à rajouter des virgules dans mon texte, si quelque part se trouvent des doubles backslash

    mais en y réfléchissant ce n'est pas un trop gros problème

    Merci !

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 711
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par AralVor Voir le message
    Je préfèrerais awk (ou sed), je n'ai pas trop l'habitude d'utiliser du python
    Ben c'est du langage de script comme un autre donc si le coeur t'en dis...

    Citation Envoyé par AralVor Voir le message
    Sinon je vois que tu substitues les chaînes pour pouvoir passer outre, c'est une bonne idée mais je risque de me retrouver à rajouter des virgules dans mon texte, si quelque part se trouvent des doubles backslash
    Ben c'est mon habitude. Si j'ai une data qui n'est pas au bon format, je la mets au bon format. Toutefois comme tu dis, ce n'est pas forcément un gros problème. On peut aussi faire différemment et remplacer "\," par "\;" voire par des patterns plus compliqués...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Salut !

    Alors j'ai opté pour sed pour changer mes formats de données et les restituer

    mais j'ai un problème assez étrange

    mon fichier est le suivant : (cat entree/215515originalLinuxUTF8.csv | more)

    10000000018422686,215515,Presse écrite,2009-01-02 07:27:22,3,Nicolas Sarkozy,0,Racine,LE FIGARO,410067,\N,International,International La difficile médiation de Sarkozy au Proche-Orient P
    our « chercher les chemins de la paix » au Proche-Orient\, selon son expression\, après le rejet
    (en gros, un fichier csv comme on en a déjà parlé, avec des champs séparés par des virgules, et des backslash pour les virgules non séparatrices de champs)

    sauf que quand je fais :

    cat entree/215515originalLinuxUTF8.csv | while read foo; do echo $foo; done
    j'ai :

    10000000018422686,215515,Presse écrite,2009-01-02 07:27:22,3,Nicolas Sarkozy,0,Racine,LE FIGARO,410067,N,International,International La difficile médiation de Sarkozy au Proche-Orient Po
    ur « chercher les chemins de la paix » au Proche-Orient, selon son expression, après le rejet
    le "echo" me supprime les backslash (alors que je suis censé les utiliser pour différencier les virgules séparatrices de champs des virgules non séparatrices de champs !)

    du coup je suis coincé. Man echo dis bien que -E permet d'ignorer les backslash mais ça ne change rien, et de toute façon c'est le fonctionnement par défaut..

    Une idée de ce qui m'arrive?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 711
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par AralVor Voir le message
    le "echo" me supprime les backslash
    Ce n'est qu'un effet d'affichage

    Citation Envoyé par AralVor Voir le message
    du coup je suis coincé
    Citation Envoyé par AralVor Voir le message
    Une idée de ce qui m'arrive?
    Oui. Et tu le comprendras tout seul dès que tu compareras ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rep=`ls -l`
    echo $rep
    avec ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rep=`ls -l`
    echo "$rep"
    Ou si tu exécutes ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "entrez une valeur :"
    read var
    test $var != non && echo "gagné"
    En le comparant avec celui-là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "entrez une valeur :"
    read var
    test "$var" != "non" && echo "gagné"
    En tapant dans les 2 cas "return" à la question (sans mettre de valeur)

    Ensuite... ben je pense que plus jamais tu n'oublieras les guillemets dans tes codes...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 22
    Points : 13
    Points
    13
    Par défaut
    Bizarre, j'avais testé de mettre les variables entre guillemets et ça n'a rien changé...

    Je retesterais demain, mais effectivement ça m'était venu à l'esprit en testant avec et sans les guillemets directement sur l'invite de commande.

    Merci pour les précisions !

  8. #8
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 711
    Points : 31 028
    Points
    31 028
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par AralVor Voir le message
    Bizarre, j'avais testé de mettre les variables entre guillemets et ça n'a rien changé...
    Exact. Je viens de tester. C'est le read qui chie.
    Exemple 1: read f => je tape "eee\,fff" puis j'affiche "$f" => j'obtiens "eee,fff"
    Exemple 2: read f => je tape "eee\\,fff" puis j'affiche "$f" => j'obtiens "eee\,fff"

    Si tu veux traiter tes backslash dans du read, faut d'abord les dédoubler. Ou alors utilise une autre méthode..

    Citation Envoyé par AralVor Voir le message
    Merci pour les précisions !
    Elles restent valable pour les autres exemples, surtout celui du test sur une saisie...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Afficher une partie precise d'une page
    Par Invité dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 20/04/2006, 22h14
  2. Afficher une partie precise de la page
    Par Invité dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 12/04/2006, 12h48
  3. Afficher une partie d'une table.
    Par n.yakine dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/03/2006, 17h43
  4. Réponses: 3
    Dernier message: 24/10/2005, 14h26
  5. [glut]afficher une partie d'une image
    Par khayyam90 dans le forum OpenGL
    Réponses: 3
    Dernier message: 17/07/2004, 15h35

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