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 :

Compteur avec awk


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Février 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Février 2019
    Messages : 13
    Points : 3
    Points
    3
    Par défaut Compteur avec awk
    Bonjour, j'ai ce type de données sur mon fichier CSV.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A;A;00
    A;A;00
    A;A;00
    B;B;00
    A;A;00
    Je souhaiterais ajouter un compteur de ligne en sed / awk qui me donnerait au final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    A;A;01
    A;A;02
    A;A;03
    B;B;01
    A;A;04
    comment feriez-vous?

    Quelle serait la commande?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    en incrémentant un tableau dont les indices seront les champs pertinents.
    Code pseudo-code : Sélectionner tout - Visualiser dans une fenêtre à part
    tableau[champ1;champ2]+=1; substituer(champCompteur;tableau[champ1;champ2])
    ???
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    En utilisant un tableau associatif, d'une part :
    Et en utilisant printf(), d'autre part, car il n'est pas naturel de faire commencer un entier par 0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("%s;%s;%02i\n",$1,$2,tab[$1,$2]);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $3=sprintf("%02i",tab[$1,$2]); } 1
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  4. #4
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Points : 5 915
    Points
    5 915
    Par défaut
    Avec Awk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    awk -F";" '{ indice=$1$2 ;  tab[indice]=tab[indice]+1 ; printf  "%s;%s;%02d\n", $1 , $2 , tab[indice]   }' fichier.txt

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Si ton bash support les tableaux associatif:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unset tab  #dans le cas que celui-ci existe déjà
    declare -A tab
    while IFS=\; read a b c ; do ((tab["$a$b"]++)) ; printf "%s;%s;%02i\n" $a $b ${tab["$a$b"]}; done <fichier
    @Flodelarab, une simplification de ta première proposition:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F\; '{printf("%s;%s;%02i\n",$1,$2,++tab[$1,$2])}'
    Qui le fait en sed ???
    Cordialement.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    declare -Ai tab
    tab[$a$b]+=1
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    [mode=relou]
    S'il y a une ligne BA;A;00 et une ligne B;AA;00, ces scripts bash vont fauter.
    [/mode]

    En sed, il n'y a toujours pas d'arithmétique. Bonne chance.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Candidat au Club
    Homme Profil pro
    Chargé de référencement
    Inscrit en
    Février 2019
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé de référencement

    Informations forums :
    Inscription : Février 2019
    Messages : 13
    Points : 3
    Points
    3
    Par défaut
    merci à tous, j'ai opté pour la réponse de beckett qui fonctionne parfaitement

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/02/2012, 11h57
  2. Réponses: 5
    Dernier message: 09/01/2005, 19h54
  3. Réponses: 33
    Dernier message: 15/10/2004, 16h19
  4. Compteur avec OpenDialog
    Par bajax dans le forum C++Builder
    Réponses: 3
    Dernier message: 25/08/2004, 13h48
  5. Problème sur une cmd avec AWK
    Par OrangeBud dans le forum Linux
    Réponses: 3
    Dernier message: 02/06/2004, 10h51

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