Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 13/06/2017, à 12:19

MINYA

Awk : Compter le nombre de caractère par ligne dans un fichier

Bonjour ,
J'essaye de compter le nombre de fois qu'un mot se répète et d'afficher le nombre de fois par ligne dans tout le fichier

Exemple d'une ligne

M2 I5 M8 D5 M1 I2 M5 I5 M9 I9 M2 I1 M4 I1 M6 I2 M2 D3 M5 I1 M3 D1 M2 D1 M6 I2 M8 I4 M2 D1 M2 D2 M5 I13 M1 I1 M4 I3 M11


1 - Je voudrais calculer le nombre de fois que la lettre M apparaît, afficher le nombre par ligne dans une nouvelle colonne, pareil pour le D et le I. (Je ne sais pas si c'est mieux de séparer les lettres des nombres)
J'essaye avec awk -o "mot" fichier | wc -l , mais cela me donne le nombre total dans tout le fichier

2 - Je voudrais de chaque ligne, additionner la valeur des M (M2, M5, M8 ... donnera (2+5+8), la même chose pour les D et les I.

Merci de m'aider

Dernière modification par MINYA (Le 13/06/2017, à 15:21)


Peace

Hors ligne

#2 Le 13/06/2017, à 17:23

αjet

Re : Awk : Compter le nombre de caractère par ligne dans un fichier

Bonjour,

Pour dénombrer les occurrences des lettres M D I avec awk, tu devrais t'en sortir comme ceci:

awk -F' ' 'BEGIN{print "Row", "M", "D", "I" }{print NR, gsub(/M/,""), gsub(/D/,""), gsub(/I/,"") }' file

L'astuce est que gsub compte le nombre de substitutions effectuées.

Edit: remplacement des \t par un simple delimiteur de champs par coherence avec la 1ere ligne.

Pour faire la somme c'est un poil plus complexe... Faut que j'y reflechisse !

Dernière modification par αjet (Le 13/06/2017, à 22:35)


αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#3 Le 13/06/2017, à 17:46

αjet

Re : Awk : Compter le nombre de caractère par ligne dans un fichier

Pour le comptage, pas sur de la syntaxe mais j'ecrirais un truc du genre

BEGIN
{
    varM =0;
    varD =0;
    varI =0;
    print "Row", "M", "D", "I"
}
{
    for(i=1; i < NF; i++) {
        if($i ~ /M([0-9])/) { varM += \\1 }
        if($i ~ /D([0-9])/) { varD += \\1 }
        if($i ~ /I([0-9])/) { varI += \\1 }
    }
    print NR, varM, varD, varI
}

αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#4 Le 13/06/2017, à 22:39

αjet

Re : Awk : Compter le nombre de caractère par ligne dans un fichier

J'ai modifié mon code et l'ai testé

gawk -F' ' 'BEGIN{ print "Row", "M", "D", "I";}
{
varM =0;varD =0;varI =0;
for(i=1; i <= NF; i++)
    {
       if($i ~ /M/) { match($i, /M([0-9])/, a); varM +=  a[1]}
       if($i ~ /D/) { match($i, /D([0-9])/, a); varD +=  a[1]}
       if($i ~ /I/) { match($i, /I([0-9])/, a); varI +=  a[1]}
    }
print NR, varM, varD, varI;}'

J'utilise gawk afin de pouvoir utiliser la fonction match qui me permet de capturer le chiffre qui suit les lettres M D et I.
Le code fait une iteration sur tous les champs de la ligne. Il y a 3 tests pour incrémenter la bonne variable varM varD ou varI en fonction de la lettre qui precede le chiffre.
A la fin de la ligne, les trois variables sont affichées.

Voici ce que ca donne

█▓▒░alex@Volkerball█▓▒░ Tue Jun 13 09:35:36pm 
~/ cat ~/tmp/test.txt                         
M2 I5 M8 D5 M1 I2 M5 I5 M9 I9 M2 I1 M4 I1 M6 I2 M2 D3 M5 I1 M3 D1 M2 D1 M6 I2 M8 I4 M2 D1 M2 D2 M5 I13 M1 I1 M4 I3 M11
M2 I5 M8 D5 
M2 I5 M8 D5 D7 D3
█▓▒░alex@Volkerball█▓▒░ Tue Jun 13 09:40:20pm 
~/ gawk -F' ' 'BEGIN{ print "Row", "M", "D", "I";}
{
varM =0;varD =0;varI =0;
for(i=1; i <= NF; i++)
    {
       if($i ~ /M/) { match($i, /M([0-9])/, a); varM +=  a[1]}
       if($i ~ /D/) { match($i, /D([0-9])/, a); varD +=  a[1]}
       if($i ~ /I/) { match($i, /I([0-9])/, a); varI +=  a[1]}
    }
print NR, varM, varD, varI;}' ~/tmp/test.txt
Row M D I
1 78 13 37
2 10 5 5
3 10 15 5

Dernière modification par αjet (Le 13/06/2017, à 22:41)


αjet: ça se prononce alfajet, bordel ! | GMT+1 | Viens poueter avec moi, bordel ! | Mes photos | Shaarli | Fluidbuntu-fr

Hors ligne

#5 Le 16/06/2017, à 16:03

MINYA

Re : Awk : Compter le nombre de caractère par ligne dans un fichier

Bonjour @αjet
Merci beaucoup, ça m'a été d'une grande aide.

Dernière modification par MINYA (Le 16/06/2017, à 16:58)


Peace

Hors ligne