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 16/08/2022, à 12:22

VroumH

Afficher la valeur la plus basse d'un groupe BASH

Bonjour  ! !

Voici une liste

fichier1

#Groupe Valeur Nom
1 -30,133 Orange
1  -6,576 Banane
1  -6,293 Pomme
1  -12,034 Abricot
1  -7,076 Mûre
2  -4,355 Pomme
2  -6,517 Banane
2  -6,355 Abricot
2  -3,502 Mûre

Je souhaiterais extraire la valeur la plus basse pour chaque groupe. (groupe 1 : 1 -30,133 : groupe 2  : 2  -6,517 )

Je me suis inspiré de ce script 

awk '/#|^ *$/{next;} {v[$1]+=$2;n[$1]++;} END{for (i in n) print i,v[i]*1.0/n[i];}' fichier1  

mais comme c'est très compliqué de trouver par rapport à la moyenne, je préfère prendre la valeur la plus basse smile

Merci smile

Hors ligne

#2 Le 16/08/2022, à 12:36

Watael

Re : Afficher la valeur la plus basse d'un groupe BASH

avant la gestion des groupes, est-ce que tu parviens à retenir la valeur la plus basse d'une simple liste de nombres ?

le B-A-BA de l'algorithmie, c'est de décomposer un problème complexe en plusieurs problèmes simples.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 16/08/2022, à 12:45

VroumH

Re : Afficher la valeur la plus basse d'un groupe BASH

Je voudrais passer par un grep '1    -'  (pour capturer le groupe 1 par exemple) puis puis inverser la liste puis un head, mais si j'ai le groupe 11 par exemple ça ne marcherait pas.

Hors ligne

#4 Le 16/08/2022, à 13:10

Watael

Re : Afficher la valeur la plus basse d'un groupe BASH

c'est du shell alors, pas du bash.

le groupe 1, en regex, ce serait : ligne commence par 1, suivi de un ou plusieurs espaces/blancs.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 16/08/2022, à 13:27

VroumH

Re : Afficher la valeur la plus basse d'un groupe BASH

Oui mais il capturerais la ligne commançant par 11 ou par 111 aussi ?

Est'ce que ton idée marcherait ici ?

1 -30,133 Orange
1  -6,576 Banane
1  -6,293 Pomme
1  -12,034 Abricot
1  -7,076 Mûre
11  -4,355 Pomme
11 -6,517 Banane
11  -6,355 Abricot
11  -3,502 Mûre

Dernière modification par VroumH (Le 16/08/2022, à 13:28)

Hors ligne

#6 Le 16/08/2022, à 13:29

Tawal

Re : Afficher la valeur la plus basse d'un groupe BASH

Hello,

Je donne une solution (qui vaut ce qu'elle vaut) avec gawk :

$ cat fichier
#Groupe Valeur Nom
1 -30,133 Orange
1  -6,576 Banane
1  -6,293 Pomme
1  -12,034 Abricot
1  -7,076 Mûre
2  -4,355 Pomme
2  -6,517 Banane
2  -6,355 Abricot
2  -3,502 Mûre
$ 
$ gawk 'BEGIN{PROCINFO["sorted_in"]="@val_num_asc"}; /#|^ *$/{next}; {sub(",", ".", $2); Val[$1][n++]=$2} END {for (i in Val) {for (j in Val[i]) {print i,Val[i][j]; break}}}' fichier
1 -30.133
2 -6.517
$

Au passage, la virgule a été changée en un point.


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#7 Le 16/08/2022, à 13:37

Watael

Re : Afficher la valeur la plus basse d'un groupe BASH

Est'ce que ton idée marcherait ici ?

est-ce que tu as essayé ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#8 Le 16/08/2022, à 13:39

Tawal

Re : Afficher la valeur la plus basse d'un groupe BASH

Juste comme ça, un peu de compréhension française : 11 n'est pas un 1 suivi d'un ou plusieurs espaces/blancs !


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#9 Le 16/08/2022, à 13:48

Watael

Re : Afficher la valeur la plus basse d'un groupe BASH

?
non, c'est un 1 suivi par un 1, suivi d'un ou plusieurs espaces/blanc. smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#10 Le 16/08/2022, à 14:00

Tawal

Re : Afficher la valeur la plus basse d'un groupe BASH

Il me semble aussi smile


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#11 Le 16/08/2022, à 15:03

Tawal

Re : Afficher la valeur la plus basse d'un groupe BASH

Je reviens sur ma solution.
Pour éviter de changer la virgule par un point, utilise cette commande plutôt :

LC_NUMERIC=C gawk 'BEGIN{PROCINFO["sorted_in"]="@val_num_asc"}; /#|^ *$/{next}; {Val[$1][n++]=$2} END {for (i in Val) {for (j in Val[i]) {print i,Val[i][j]; break}}}' fichier

Edit:
Correction orthographique

Dernière modification par Tawal (Le 16/08/2022, à 15:04)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#12 Le 16/08/2022, à 15:07

VroumH

Re : Afficher la valeur la plus basse d'un groupe BASH

D'accord ! Merci je teste wink

Hors ligne

#13 Le 16/08/2022, à 15:23

Tawal

Re : Afficher la valeur la plus basse d'un groupe BASH

tu peux, ça fonctionne.
Mais tu ne sais pas pourquoi ...
Watael te faisait chercher par toi même pour que tu apprennes wink


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#14 Le 16/08/2022, à 15:24

Watael

Re : Afficher la valeur la plus basse d'un groupe BASH

mais, c'est toujours pas du bash. sad


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 16/08/2022, à 15:40

Tawal

Re : Afficher la valeur la plus basse d'un groupe BASH

En effet !
Et je te prie de m'en excuser tongue

En bash, comme ça en 1er jet, je pense que j'analyserais la partie entière (signée) d'abord puis en cas d'égalité avec une autre valeur, je comparerais la partie décimale (edit: chiffre par chiffre).

Dernière modification par Tawal (Le 16/08/2022, à 15:43)


Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !

Hors ligne

#16 Le 16/08/2022, à 16:05

VroumH

Re : Afficher la valeur la plus basse d'un groupe BASH

Je sais j'évolue deux fois plus vite en cherchant sur le script lui-même,

PROCINFO["sorted_in"]
@val_num_asc
#
|
^
*
Val[$1][n++]=$2

Ce sont des éléments très efficaces qui ne me seraient jamais venu à l'idée

Hors ligne

#17 Le 16/08/2022, à 16:25

Watael

Re : Afficher la valeur la plus basse d'un groupe BASH

comme je l'ai dit dans un autre sujet, utiliser bc quand il s'agit d'évaluer des décimaux ne me pose pas de problème, parce que bash ne sait pas le faire.
ce qui est très différent de proposer une solution complète dans un autre langage.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#18 Le 16/08/2022, à 16:26

Hizoka

Re : Afficher la valeur la plus basse d'un groupe BASH

Si ses valeurs ont toujours 3 chiffres après la virgule , tu peux même supprimer la virgule avant de faire une comparaison toute simple.
Avec une petite suppression des 0 au début histoire de ne pas planter avec un 0.352.

Sinon en shell, pour aller dans le sens de sa demande :

Je voudrais passer par un grep '1    -'  (pour capturer le groupe 1 par exemple) puis puis inverser la liste puis un head, mais si j'ai le groupe 11 par exemple ça ne marcherait pas.

cat test.txt
1 -30,133 Orange
1  6,576 Banane
1  -6,293 Pomme
1 -12,034 Abricot
1  -7,076 Mûre
2  -04,355 Pomme
2 6,517 Banane
2  -60,355 Abricot
2  -3,502 Mûre
11  -45,355 Pomme
11 6,517 Banane
11  -61,355 Abricot
11  -3,502 Mûre
while read Num
do
    # La fameuse expression dont te parle Watael, ligne commençant par un numéro suivi d'espace(s)
    # Ton tri sur la 2e colonne
    # On ne garde que la 1ere ligne
    grep -E "^$Num[[:space:]]+" test.txt | sort -nk2 | head -n 1
done < <(grep -Eo "^[0-9]+[[:space:]]" test.txt | sort -un)
# Le grep permet de ressortir chaque liste de groupe
# Le sort les range et n'en conserve qu'un seul exemplaire

1 -30,133 Orange
2  -60,355 Abricot
11  -61,355 Abricot

KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#19 Le 16/08/2022, à 16:36

Watael

Re : Afficher la valeur la plus basse d'un groupe BASH

tu refais un grep de tout le fichier autant de fois qu'il y a de groupes !? sad
ça va rapidement ralentir le script smile


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#20 Le 16/08/2022, à 17:38

Hizoka

Re : Afficher la valeur la plus basse d'un groupe BASH

C'est pas faux smile

Tu ferais comment pour éviter cette boucle avec globalement les mêmes commandes ?


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#21 Le 16/08/2022, à 20:29

Watael

Re : Afficher la valeur la plus basse d'un groupe BASH

ben, justement, je n'utiliserais pas les mêmes commandes.

TantQue on lit dans des variables grp val fruit
on teste que la valeur du tableau groups[grp] est supérieur à val ET on assigne val à groups[grp]
finTantQue


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne