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 29/11/2016, à 18:55

Beuhlet_Reseau

Trier 2 colonnes + uniq -c

Bonjour,

J'ai fait un script qui associe un ID à une consommation de ressource.

En gros voici mon fichier :

cat toto.txt

73404 6932
73601 22377
73601 7198503
73602 153
73602 362
73602 579
73801 13553
73801 215699
73801 756117
74000 289475

Je viens de le sorté mais mon objectif serait plutôt de regrouper la somme des ressource par ID Unique

J'ai essayé de faire un uniq -c (pour grouper mes ID mais cela ne semble pas fonctionner) derrière si je fais une somme il me le fait sur toute la colonne donc ça donne un truc incompréhensible.

Le résultat que j'aimerais serait ceci : 

73404 6932
73601 7220880
73602 1100
73801 985369
74000 289475

Je sais pas si je dois faire un cat toto.txt | uniq -c | gawk -F" " '{ressources+=strtonum($2);} END {print ressources}' | sort -n.


L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).

Hors ligne

#2 Le 29/11/2016, à 19:05

pingouinux

Re : Trier 2 colonnes + uniq -c

Bonjour,

awk '{ressources[$1]+=$2;} END {for( i in ressources) print i,ressources[i]}' toto.txt | sort -n

Hors ligne

#3 Le 29/11/2016, à 19:57

erresse

Re : Trier 2 colonnes + uniq -c

pingouinux, pourquoi obtient-on ce résultat avec ta commande ?

73404 6932
73602 1094
73801 985369
74000 289475
73601 7220880

On dirait que le tri n'est pas fait correctement...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#4 Le 29/11/2016, à 20:35

pingouinux

Re : Trier 2 colonnes + uniq -c

C'est bizarre, j'obtiens ceci :

$ awk '{ressources[$1]+=$2;} END {for( i in ressources) print i,ressources[i]}' toto.txt | sort -n
73404 6932
73601 7220880
73602 1094
73801 985369
74000 289475

Hors ligne

#5 Le 29/11/2016, à 21:23

Compte anonymisé

Re : Trier 2 colonnes + uniq -c

je confirme, j'ai le même résultat que erresse.

Pour le même résultat il faut remplacer sort -n par sort -g (voire sort tout court si il y a toujours 5 chiffres)

une version de sort différente ?

Dernière modification par Compte anonymisé (Le 29/11/2016, à 21:24)

#6 Le 29/11/2016, à 21:40

pingouinux

Re : Trier 2 colonnes + uniq -c

$ sort --version
sort (GNU coreutils) 8.21

$ awk --version
GNU Awk 4.0.1

Hors ligne

#7 Le 29/11/2016, à 21:45

Laurent85

Re : Trier 2 colonnes + uniq -c

Avec gawk il y a la possibilité de spécificer l'ordre de parcours du tableau, de cette manière le tri est déjà fait pendant la boucle for :

awk '{ressources[$1]+=$2;} END {PROCINFO["sorted_in"]="@ind_num_asc"; for( i in ressources) print i,ressources[i]}' toto.txt

Lien Doc gawk

Hors ligne

#8 Le 29/11/2016, à 21:56

pingouinux

Re : Trier 2 colonnes + uniq -c

J'avais trouvé une autre solution :

$ awk '{r[$1]+=$2;} END {N=asorti(r,s);for(n=1;n<=N;n++) print s[n],r[s[n]]}' toto.txt
73404 6932
73601 7220880
73602 1094
73801 985369
74000 289475

Édité : Contrairement à la solution de Laurent 85 (#7), la mienne (#8) ne marche pas si les nombres de la 1ère colonne n'ont pas tous le même nombre de chiffres. Celle en #2 fonctionne chez moi (avec le sort -n)

Dernière modification par pingouinux (Le 29/11/2016, à 22:10)

Hors ligne

#9 Le 30/11/2016, à 13:08

erresse

Re : Trier 2 colonnes + uniq -c

Côté versions de sort et awk, chez moi j'ai ça :

sort (GNU coreutils) 8.25
GNU Awk 4.1.3, API: 1.1 (GNU MPFR 3.1.4, GNU MP 6.1.0)

Peut-être en effet y a-t-il une différence par rapport aux versions de pingouinux...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#10 Le 30/11/2016, à 13:51

Beuhlet_Reseau

Re : Trier 2 colonnes + uniq -c

pingouinux a écrit :

Bonjour,

awk '{ressources[$1]+=$2;} END {for( i in ressources) print i,ressources[i]}' toto.txt | sort -n

Bonjour,

Merci pour votre aide.

Cette commande ne groupe pas les champs identiques de la colonne 1 :

360110;79244
360110;902982
708001;270
708001;7695
714020;10561
714020;10951

Mon séparateur étant ";" peut-être que cela l'induit en erreur.

Pouvez m'expliquer le principe ?

awk '{ressources[$1]+=$2;} : Créer un tableau j'imagine ?

mais

{for( i in ressources) print i,ressources[i]}'

reste un peu flou


L'avenir appartient à ceux qui se lèvent tôt... Pas ceux qui crachent trop (vite?).

Hors ligne

#11 Le 30/11/2016, à 15:03

pingouinux

Re : Trier 2 colonnes + uniq -c

@erresse :
Dans ton résultat en #3, on dirait que le tri numérique s'effectue en concaténant les 2 colonnes. Peux-tu essayer ceci

... | sort -nk1

Hors ligne

#12 Le 30/11/2016, à 15:59

Laurent85

Re : Trier 2 colonnes + uniq -c

Beuhlet_Reseau a écrit :
360110;79244
360110;902982
708001;270
708001;7695
714020;10561
714020;10951

Mon séparateur étant ";" peut-être que cela l'induit en erreur.

Utilise la commande suivante avec l'option -F ';', elle indique le séparateur de champs de ton fichier :

awk -F ';' '{ressources[$1]+=$2;} END {PROCINFO["sorted_in"]="@ind_num_asc"; for( i in ressources) print i,ressources[i]}' toto.txt

Pouvez m'expliquer le principe ?

awk '{ressources[$1]+=$2;} : Créer un tableau j'imagine ?

Oui un tableau associatif avec le champ 1 comme clé et le champ 2 comme valeur.

mais

{for( i in ressources) print i,ressources[i]}'

reste un peu flou

La boucle for parcours les éléments du tableau, print affiche pour l'élément en question sa clé et la valeur associée.

Hors ligne

#13 Le 30/11/2016, à 19:14

erresse

Re : Trier 2 colonnes + uniq -c

pingouinux a écrit :

@erresse :
Dans ton résultat en #3, on dirait que le tri numérique s'effectue en concaténant les 2 colonnes. Peux-tu essayer ceci

... | sort -nk1

Ben non, ça donne le même résultat, même en précisant le champ 1 en clé, mais je crois que cette syntaxe (nk1) implique que la clé va jusqu'en fin de ligne...

erresse@erresse-mate:~$ awk '{ressources[$1]+=$2;} END {for( i in ressources) print i,ressources[i]}' toto.txt | sort -nk1
73404 6932
73602 1094
73801 985369
74000 289475
73601 7220880
erresse@erresse-mate:~$ 

Par contre, avec cette clé-là, ça a l'air de marcher :

erresse@erresse-mate:~$ awk '{ressources[$1]+=$2;} END {for( i in ressources) print i,ressources[i]}' toto.txt | sort -nk1.1,1.5
73404 6932
73601 7220880
73602 1094
73801 985369
74000 289475
erresse@erresse-mate:~$ 

Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne