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 :

Restreindre sed ou awk à une colonne d'un fichier csv ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Analyste Fraude Bancaire
    Inscrit en
    Juin 2016
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Malte

    Informations professionnelles :
    Activité : Analyste Fraude Bancaire

    Informations forums :
    Inscription : Juin 2016
    Messages : 1
    Par défaut Restreindre sed ou awk à une colonne d'un fichier csv ?
    Bonjour à tous, je suis nouveau sur ce forum, et je suis bloqué dans l'écriture d'un script bash.

    J'ai le fichier .csv suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    05/17/2016 15:37:47,102,11801
    05/21/2016 13:45:53,79,102
    05/21/2016 22:03:26,3,9926911
    Le second champ est un code numérique, j'aimerais remplacer sa valeur (via sed ou awk) par quelque chose de plus lisible ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    05/17/2016 15:37:47,GOOGLE,11801
    05/21/2016 13:45:53,MICROSOFT,102
    Pour celà, je cherche à resteindre l'exécution de SED ou d'AWK à cette seule colonne. J'avais pensé faire çà avec cut mais çà ne marche pas comme prévu.

    Code proposé par un contributeur à mon cas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F@ '$3 ~ /pattern/ { OFS= "@"; $3 = "replace"; }'
    J'ai remplacé les "@" par des virgules vu que ce sont mon séparateur de champs à moi, et les "$3" par des "$2" vu que c'est la colonne qui m'intéresse à moi... sans succés jusque là.

    Si vous pouviez y jeter un coup d'oeil, merci d'avance !

  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
    Bonjour,

    Il nous manque un élément pour répondre à ton besoin, à quoi ressemble le fichier de correspondance entre la valeur numérique et la chaine de remplacement ?

    Un exemple:
    ton fichier (appelons le fic.csv):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    05/17/2016 15:37:47,102,11801
    05/21/2016 13:45:53,79,102
    05/21/2016 22:03:26,3,9926911
    Le fichier avec les correspondance pattern (appelons le pattern.csv):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    102,GOOGLE
    79,MICROSOFT
    45,FOO
    3,BAR
    le code awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\, 'BEGIN{OFS=FS};FNR == NR {A[$1]=$2; next};NF==3{$2=A[$2]}1' pattern.csv fic.csv

  3. #3
    Membre expérimenté Avatar de silfun1
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2015
    Messages : 135
    Par défaut
    Bonjour à tous, bonjour Flekain,

    Voici un premier essai de script.
    Je pars du principe que tu as ton fichier de départ (nommé tab1.csv dans mon script) mais aussi un fichier de correspondance "Entreprise <-> Code" (nommé tab1_nom.csv dans mon exemple)

    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
    25
    26
    27
    28
     #!/bin/bash
     
    # created the 22/06/2016 by silfun1 with the tool UsiScript (http://www.usiscript.com/)
     
    csvfileglobal="tab1.csv"
    csvfileidnom="tab1_nom-id.csv"
    csvnewfile="tab1_new.csv"
     
     
    #création du nouveau fichier csv
    echo "" > $csvnewfile
     
    # Read the csv text file
    while read linecsv
    do
        # récupération des données du fichier général
        # Cela servira a recréer la ligne ultérieurement, avec le nom de l'entreprise au lieu de l'Id
        champdate=$(echo $linecsv|cut -d',' -f1)
        champidcomp=$(echo $linecsv|cut -d',' -f2)
        champmontant=$(echo $linecsv|cut -d',' -f3)
     
        # récupération du nom de la compagnie en fonction de son identifiant
        champnomcomp=$(grep $champidcomp $csvfileidnom|cut -d',' -f1)
     
        # ajout de la nouvelle ligne dans le nouveau fichier csv
        echo "$champdate $champnomcomp $champmontant" >> $csvnewfile
     
    done < $csvfileglobal

    Sylvain

  4. #4
    Membre expérimenté Avatar de silfun1
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2015
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2015
    Messages : 135
    Par défaut
    J'avais pas rafraichi la page du post. Du coup, pas vu la réponse de disedorgue, qui est plus courte. J'avoue que j'oublie souvent notre ami awk

    Sylvain

  5. #5
    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
    Voici une version bash builtin plus rapide:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    declare -A XXX
    while read
    do
       XXX[",${REPLY%,*},"]="${REPLY#*,}"
    done <pattern.csv
    while read
    do
       [[ $REPLY =~ ,[0-9]*, ]]
       [[ -n ${XXX["${BASH_REMATCH[0]}"]} ]] && echo ${REPLY/,[0-9]*,/,${XXX["${BASH_REMATCH[0]}"]},} || echo "$REPLY"
    done <fic.csv

Discussions similaires

  1. sed substitue dans une colonne
    Par benlakhel dans le forum Shell et commandes POSIX
    Réponses: 5
    Dernier message: 27/12/2013, 14h45
  2. Ajout d'une colonne dans un fichier csv
    Par sorilazer dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 12/11/2012, 18h08
  3. Récupérer une colonne d'un fichier CSV à l'aide de l'entête
    Par drake56 dans le forum Windows Forms
    Réponses: 5
    Dernier message: 06/01/2010, 20h23
  4. [PowerShell] [PowerShell]Utiliser une colonne d'un fichier csv
    Par Léponge85 dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 26/02/2009, 11h54
  5. Réponses: 2
    Dernier message: 31/08/2006, 09h57

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