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 :

Aide commande awk


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Par défaut Aide commande awk
    Bonjour, je souhaiterais traiter une ligne issue d'un fichier .csv comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # cat fichier.csv
    host;adresse_ip;ci_host;champ1;champ2;champ3;champ4;champ5;champ6;champ7;champ8
    Le résultat attendu est d'insérer un saut de ligne tous les 3 champs comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    host;adresse_ip;ci_host;
    champ1;champ2;champ3;
    champ4;champ5;champ6;
    champ7;champ8
    Si quelqu'un aurait une idée de comment coder ça en shell ?
    J'ai pensé à la commande awk mais peut être y a t-il une meilleur solution.

    Merci.

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Salut.

    Citation Envoyé par arso91 Voir le message
    J'ai pensé à la commande awk mais peut être y a t-il une meilleur solution.
    Oui tu peut te servir de awk (tu dois aussi pouvoir plus simplement te servir de cut) dans un script shell mais avant d'avoir une solution toute faite, essayes de le faire par toi même et montre nous ce que tu as fait .

    Cordialement,
    Idriss

  3. #3
    Membre averti
    Inscrit en
    Décembre 2010
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 20
    Par défaut
    Voici une méthode (enfin !!) pour mon problème :

    cat fichier.csv | awk '{c=split($0,arr,";"); for(n=1; n<=c; ++n) print arr[n]}'| awk 'ORS=NR%3?",":"\n"' | sed '$s/.$//'

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Par défaut
    Bonjour.

    Une autre solution (surement pas la plus simple) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    #!/bin/bash
     
    #fichier
    FICHIER=fichier.csv
     
    # nombre d'élément
    SIZE=$(cat $FICHIER | awk 'BEGIN{FS=";"} {print NF}')
     
    j=1
    for (( i=1 ; i<=$SIZE ; i=$i+1 ))
    do
          elem=$(cat $FICHIER | awk 'BEGIN{FS=";"} {print $('$i')}')
          let j=$j+1
     
          printf "$elem;"
     
          if [ $j -eq 4 ]
          then
             j=1
             echo ""
          fi
    done
     
    echo ""
    Cordialement,
    Idriss

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/usr/bin/gawk -f
     
    n=split($0,Array,";"){
       for(i=1; i<=n; i++){
          (i%3 && n-i) ? fmt="%s;" : fmt="%s\n"
          printf(fmt,Array[i])
       }
    }
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
     
    while IFS=';' read -a Array
    do for ((i=1; i<=${#Array[@]}; i++))
       do ((i%3 && ${#Array[@]}-i)) && fmt="%s;" || fmt="%s\n"
          printf "$fmt" "${Array[i-1]}"
       done
    done < fichier.csv
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Option NR de la commande AWK
    Par tux2005 dans le forum Linux
    Réponses: 5
    Dernier message: 20/09/2010, 14h25
  2. Aide sur commande awk
    Par lili_bzh dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 20/12/2006, 10h55
  3. Questions sur la commande awk
    Par vbcasimir dans le forum Shell et commandes GNU
    Réponses: 15
    Dernier message: 17/01/2006, 10h35
  4. Commande awk
    Par ujoodha dans le forum Linux
    Réponses: 1
    Dernier message: 01/12/2005, 14h34
  5. Réponses: 11
    Dernier message: 12/04/2005, 14h08

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