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 :

Ajout ligne entre des données de colonnes semblables avec awk


Sujet :

Shell et commandes GNU

  1. #1
    Membre à l'essai Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Points : 19
    Points
    19
    Par défaut Ajout ligne entre des données de colonnes semblables avec awk
    Bonjour, je souhaiterai séparer les lignes dont une colonne contient des informations semblables

    Exemple , ici je voudrais séparer mon fichier en fonction de la première colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     tata xoxo 8989
    tata baba 89
    tata bob 55 
    toto roro 66
    toto soso 12
    titi wowo 36
    titi nono 77 
    titi bobo 47 
    titi popo 12
    donc le fichier de sortie, je le voudrais ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    séparateur1
    tata xoxo 8989
    tata baba 89
    tata bob 55 
    séparateur2
    toto roro 66
    toto soso 12
    séparateur3
    titi wowo 36
    titi nono 77 
    titi bobo 47 
    titi popo 12

    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 392
    Points
    28 392
    Par défaut
    D'un point de vue traitement, c'est relativement simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Initialisation :
      Variable := ""
    Boucle : (pour chaque ligne)
      Si Variable <> champ1
        Imprimer séparateur
        Variable := champ1
      Imprimer ligne
    il ne te reste plus qu'à le traduire en awk...

  3. #3
    Membre à l'essai Avatar de Shyma
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 100
    Points : 19
    Points
    19
    Par défaut
    Il se trouve que le champs1, champs 2 etc sont différents, et que mon fichier est long, donc je ne pourrais pas faire la comparaison uniquement pour le champs1 ou le champs2, il me faut quelque chose d'automatique, qui le compare, et si c'est identique, un séparateur sera ajouté. Je ne sais pas si je suis assez claire dans mes explications

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    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 102
    Points : 5 851
    Points
    5 851
    Par défaut
    Citation Envoyé par Shyma Voir le message
    Je ne sais pas si je suis assez claire dans mes explications
    Bonjour Shyma.

    Ce forum est destiné à apporter de l'aide à ceux qui en ont besoin, mais pas de faire tout le travail à leur place.

    La réponse de al1_24 est, à mes yeux, extrêmement claire et pertinente.

    Il me semble en revanche que ce n'est pas aussi clair pour toi...

    Je vais donc essayer d'ajouter mon grain de sel pour expliciter...

    Citation Envoyé par Shyma Voir le message
    il me faut quelque chose d'automatique
    al1_24 te suggère d'écrire un programme "awk" qui fasse automatiquement le travail à ta place. Une fois le programme "awk" écrit (soit dans un fichier "mon_fichier.awk", soit sur une ou quelques lignes de code "awk"), tu pourras le faire tourner sur ton fichier de données "mon_fichier_de_donnees.csv" en tapant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    awk -f "mon_fichier.awk" mon_fichier_de_donnees.csv > mon_nouveau_fichier_de_donnees.csv
    # ou bien
    awk 'mes lignes de code awk' mon_fichier_de_donnees.csv > mon_nouveau_fichier_de_donnees.csv
    Citation Envoyé par Shyma Voir le message
    Il se trouve que le champs1, champs 2 etc sont différents, et que mon fichier est long, donc je ne pourrais pas faire la comparaison uniquement pour le champs1 ou le champs2
    Je ne comprends pas pourquoi tu dis cela... à moins que tu ne croies que "champ2" corresponde au 1er champ de la 2ème ligne, ce qui n'est pas le cas!
    Dans le fichier de données que tu nous fournis, ce que nous appelons "champ1", c'est la première colonne de chaque ligne. Donc, au fur et à mesure que le programme "awk" parcourt les lignes de ton fichier de données, le "champ1" prend successivement les valeurs "tata", "tata", "tata", "toto", "toto", "titi", "titi", "titi", "titi".

    Je fais une toute petite modification dans l'algorithme proposé par al1_24 et qui doit servir de trame au programme "awk" que tu dois écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Début :
      precedente_valeur_de_champ1 := ""
    Boucle : (pour chaque ligne lue automatiquement par le programme "awk")
      Si champ1 <> precedente_valeur_de_champ1
        alors
          Imprimer une ligne avec le séparateur
          precedente_valeur_de_champ1 := champ1
        fin si
      Puis (dans tous les cas) imprimer la ligne courante
    Fin boucle (pour chaque ligne)
    J'espère que tu as assez d'infos pour te mettre au boulot!

Discussions similaires

  1. Passer de données en ligne a des données en colonnes
    Par lozeba dans le forum Langage SQL
    Réponses: 4
    Dernier message: 24/04/2010, 17h45
  2. ajouter et supprimer des données dans un tcd avec vba
    Par pscoool dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 09/12/2009, 18h14
  3. Passer des données en colonne a données ordonnées en ligne
    Par taollagad dans le forum VBA Access
    Réponses: 2
    Dernier message: 17/05/2009, 02h36
  4. Comment faire un retour ligne entre des " ??
    Par DrTank dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 09/05/2005, 09h35
  5. Empêcher le retour á la ligne entre des balises <Hx> e
    Par thomas_chamas dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 29/11/2004, 16h39

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