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 :

awk : traiter des champs sur plusieurs lignes


Sujet :

Shell et commandes GNU

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut awk : traiter des champs sur plusieurs lignes
    Bonjour,

    dans la news La légende d'Unix Brian Kernighan, qui ne nous doit rien, continue à corriger le code fondamental d'AWK, je lis
    Cependant, certains fichiers ont des données regroupées sur plusieurs lignes plutôt que sur une seule. Dans ce cas, on parle d'enregistrement et l'on peut indiquer à Awk de traiter plusieurs lignes à la fois, jusqu'à la fin d'un enregistrement, en modifiant les variables FS (séparateur de champs) et RS (séparateur d'enregistrements).
    je n'en sais probablement pas encore assez, mais je ne vois pas comment.

    si quelqu'un a un exemple de tel fichier, et la manière de le traiter avec awk...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 361
    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 361
    Par défaut
    Techniquement, tu as le fichier à la windows qui termine les lignes par \r\n au lieu de \n.

    Donc, pour ceux là, tu positionnes la variable awk RS à "\r\n" et le tour est joué.

    Le RS n'est ni plus ni moins ce que l'on considère comme la fin de ligne.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    d'après la description, j'imagine un fichier comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    champ1L1 champ champ3L1
             2L1
    champ1L2 champ2L2 champ3L3
    assigner le RS à \s\n permettrait de retrouver l'intégr(al)ité du deuxième champ de la première ligne ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 361
    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 361
    Par défaut
    Non,
    FS pour Field Separator (colonne)
    RS pour Row Separator (ligne)

    Et dans une Row tu as des Fields mais dans un Field tu n'a pas de Row

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    comment expliques-tu ceci, alors :
    certains fichiers ont des données regroupées sur plusieurs lignes plutôt que sur une seule.
    [...]
    on peut indiquer à Awk de traiter plusieurs lignes à la fois, jusqu'à la fin d'un enregistrement, en modifiant les variables FS (séparateur de champs) et RS (séparateur d'enregistrements)
    je ne comprends probablement pas la première ligne.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 361
    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 361
    Par défaut
    Une mauvaise expression, car RS ne fait que modifier la notion de fin de ligne.
    Si dans RS tu mets par exemple "toto", alors awk considérera que la fin de ligne est "toto" et non plus "\n".

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    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 840
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par N_BaH Voir le message
    si quelqu'un a un exemple de tel fichier
    Oui, tu peux regarder ici. Tu trouveras plein d'exemples de fichiers à la con qui ont des champs sur plusieurs lignes.
    Et de mon côté j'ai eu des cas analogues (principalement issus de fichiers Excels dans lesquels les cellules contenaient plusieurs lignes, et ensuite convertis en CSV)

    Citation Envoyé par N_BaH Voir le message
    et la manière de le traiter avec awk...
    Je viens de tenter ce truc : un fichier "X" contenant ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Hello World
    Ceci est un exemple:
    Hello World2
    Ceci est un exemple2:
    Et traité via cette ligne: awk 'BEGIN {RS=":"} {printf("[%s]\n", $0)}' X.

    Le résultat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    [Hello World
    Ceci est un exemple]
    [
    Hello World2
    Ceci est un exemple2]
    [
    ]
    Un petit souci de '\n' résiduel mais ça marche. Ceci dit, de mon côté j'ai traité mes fichiers via Python et son module csv. C'était quand-même bien plus pratique.
    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]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    d'accord. merci.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    d'après la description, j'imagine un fichier comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    champ1L1 champ champ3L1
             2L1
    champ1L2 champ2L2 champ3L3
    assigner le RS à \s\n permettrait de retrouver l'intégr(al)ité du deuxième champ de la première ligne ?
    EDIT :
    mais en fait, il serait plutôt à peu près comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    champ1L1 champ
    2L1 champ
    3L1§
    champ1L2 champ2L2 champ3L2§
    pour lequel FS=' ' et RS='§'
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 361
    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 361
    Par défaut
    Oui, j'ai l'impression que tu as trouvé un nouveau jouet

  11. #11
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Oui, tu peux regarder ici. Tu trouveras plein d'exemples de fichiers à la con qui ont des champs sur plusieurs lignes.
    J'ai l'impression que celui qui veut écrire un parser csv après avoir lu la référence est soit maso soit fou soit très sûr de lui...

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

Discussions similaires

  1. [AC-2013] Requête sur des champs de plusieurs lignes
    Par Evaroxi dans le forum Access
    Réponses: 8
    Dernier message: 07/05/2015, 11h53
  2. AWK Comparer un champ sur plusieurs lignes
    Par drac08 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 21/08/2012, 18h03
  3. Réponses: 12
    Dernier message: 25/09/2007, 17h22
  4. [HSQL] Inverser des booleans sur plusieurs lignes
    Par Djobird dans le forum Langage SQL
    Réponses: 8
    Dernier message: 24/06/2007, 21h13
  5. Réponses: 2
    Dernier message: 18/11/2005, 21h40

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