#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
Merci
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.
En 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.
En 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.
En 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.
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#10 Le 16/08/2022, à 14:00
- Tawal
Re : Afficher la valeur la plus basse d'un groupe BASH
Il me semble aussi
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
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
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.
Connected \o/
Welcome to sHell. · eval is evil.
En 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
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.
En 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 !?
ça va rapidement ralentir le script
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#20 Le 16/08/2022, à 17:38
- Hizoka
Re : Afficher la valeur la plus basse d'un groupe BASH
C'est pas faux
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.
En ligne